#include "memory_ec20.h" OneWire_EC20_typeDef mem_page = {}; uint8_t DS28EC20_init(void* GPIOx, uint16_t GPIO_Pin) { GPIO_TypeDef *GpioPort = (GPIO_TypeDef*)GPIOx; oneWire_init(GpioPort, 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(); } } /** * @brief Write data to memory * @return 0 - OK, 1 or 2 - bad address */ 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_readData1B(uint16_t address) { mem_page.buffer_rx[1] = mem_page.buffer_rx[0] = 0; DS28EC20_readMem(address, 1); uint8_t data8 = mem_page.buffer_rx[0]; return data8; } /** * @brief Zapíše dáta do pamäte. Maximálna dlžka data je 32B. */ uint8_t DS28EC20_writeData(uint8_t *data, uint16_t adr, uint8_t length) { memcpy(mem_page.buffer_tx, data, length); return DS28EC20_writeMem(adr,length); } uint8_t DS28EC20_getId(uint8_t* data) { owGetROM(mem_page.ROM); memcpy(data, mem_page.ROM, 8); return 8; } /** * Return capacity in Bytes */ uint32_t DS28EC20_getCapacity(void) { return 2560; }