| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include "memory_ec20.h"
- OneWire_EC20_typeDef mem_page;
- Ec20_MemoryDriver memory_ec20 = {
- DS28EC20_init,
- 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();
- }
- }
- /**
- * @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_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);
- }
- */
|