#include "memory_ec20.h" OneWire_EC20_typeDef mem_page; Ec20_MemoryDriver memory_ec20 = { DS28EC20_init, DS28EC20_readMem, DS28EC20_writeMem, DS28EC20_readData4B, DS28EC20_readData2B, DS28EC20_writeData4B, DS28EC20_writeData2B }; Ec20_MemoryDriver *getEc20MemoryDriver() { return &memory_ec20; } uint8_t DS28EC20_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { oneWire_init(GPIOx, GPIO_Pin); mem_page.real_size=0; HAL_Delay(2); owFirst(); owGetROM(mem_page.ROM); if (mem_page.ROM[0] != DS28EC20_FAMILY_CODE) { return 0; } return 1; } void DS28EC20_readMem(uint16_t address, uint8_t size) { owReset(); owSelect(mem_page.ROM); owWriteByte(CMD_READ_MEMORY, OW_STRONG_OFF); owWriteByte(address & 0xFF, OW_STRONG_OFF); owWriteByte(address >> 8, OW_STRONG_OFF); uint8_t i; for(i=0; i < size ; i++) { mem_page.buffer_rx[i] = owReadByte(); } } uint8_t DS28EC20_writeMem(uint16_t addr, uint8_t size) { uint8_t TA1 = (uint8_t) (addr & 0xFF); uint8_t TA2 = (uint8_t) ((addr >> 8) & 0xFF); uint8_t i; owReset(); owSelect(mem_page.ROM); owWriteByte(CMD_WRITE_SCRATCHPAD, OW_STRONG_OFF); // 0x0F owWriteByte(TA1,OW_STRONG_OFF); owWriteByte(TA2, OW_STRONG_OFF); for (i = 0 ; i < size; i++) { owWriteByte(mem_page.buffer_tx[i], OW_STRONG_OFF); } owReset(); owSelect(mem_page.ROM); owWriteByte(CMD_READ_SCRATCHPAD, OW_STRONG_OFF); //0xAA uint8_t tempVal = owReadByte(); if (tempVal != TA1) return 1; tempVal = owReadByte(); if (tempVal != TA2) return 2; uint8_t ES = owReadByte(); for (i = 0 ; i < size; i++) { tempVal = owReadByte(); if (tempVal != mem_page.buffer_tx[i]) return i+10; } HAL_Delay(10); owReset(); owSelect(mem_page.ROM); owWriteByte(CMD_COPY_SCRATCHPAD, OW_STRONG_OFF); //0x55 owWriteByte(TA1, OW_STRONG_OFF); owWriteByte(TA2, OW_STRONG_OFF); owWriteByte(ES, OW_STRONG_OFF); HAL_Delay(10); owReset(); return 0; } uint32_t DS28EC20_readData4B(uint16_t address) { mem_page.buffer_rx[3] = mem_page.buffer_rx[2] = mem_page.buffer_rx[1] = mem_page.buffer_rx[0] = 0; DS28EC20_readMem(address, 4); uint32_t data32 = mem_page.buffer_rx[3]; data32 |= mem_page.buffer_rx[2]<<8; data32 |= mem_page.buffer_rx[1]<<16; data32 |= mem_page.buffer_rx[0]<<24; return data32; } uint16_t DS28EC20_readData2B(uint16_t address) { mem_page.buffer_rx[1] = mem_page.buffer_rx[0] = 0; DS28EC20_readMem(address, 2); uint16_t data16 = mem_page.buffer_rx[1]; data16 |= mem_page.buffer_rx[0]<<8; return data16; } uint8_t DS28EC20_writeData4B(uint32_t data, uint16_t adr) { mem_page.buffer_tx[0] = data>>24; mem_page.buffer_tx[1] = (data>>16) & 0xFF; mem_page.buffer_tx[2] = (data>>8) & 0xFF; mem_page.buffer_tx[3] = (data) & 0xFF; return DS28EC20_writeMem(adr,4); } uint8_t DS28EC20_writeData2B(uint16_t data, uint16_t adr) { mem_page.buffer_tx[0] = (data>>8) & 0xFF; mem_page.buffer_tx[1] = (data) & 0xFF; return DS28EC20_writeMem(adr,2); } uint8_t DS28EC20_writeData4char(uint8_t *data, uint16_t adr) { mem_page.buffer_tx[0] = data[0]; mem_page.buffer_tx[1] = data[1]; mem_page.buffer_tx[2] = data[2]; mem_page.buffer_tx[3] = data[3]; return DS28EC20_writeMem(adr,4); }