| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #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;
- }
|