uint8_t fm24_sleep(void) { uint8_t rv = 0; uint8_t i2c_buff[1] = { FM24_BA << 1 }; uint8_t i2c_data[1] = { FM24_SLEEP }; i2c_package_t pkg; pkg.slave_addr = FM24_RSVD; pkg.addr = i2c_buff; pkg.addr_len = 1; pkg.data = i2c_data; pkg.data_len = 1; pkg.options = I2C_NO_ADDR_SHIFT | I2C_WRITE; #ifdef HARDWARE_I2C i2c_transfer_start(&pkg, NULL); #else rv = i2cm_transfer(&pkg); //if (rv != I2C_ACK) { // return EXIT_FAILURE; //} #endif fm24_status &= ~FM24_AWAKE; return rv; }
uint32_t fm24_read(uint8_t * data, const uint32_t data_len) { uint8_t rv = 0; i2c_package_t pkg; pkg.slave_addr = FM24_BA; pkg.addr = NULL; pkg.addr_len = 0; pkg.data = data; pkg.data_len = data_len; pkg.options = I2C_READ | I2C_LAST_NAK; #ifdef HARDWARE_I2C i2c_transfer_start(&pkg, NULL); #else rv = i2cm_transfer(&pkg); if (rv != I2C_ACK) { return EXIT_FAILURE; } #endif #ifdef FM24_HAS_SLEEP_MODE fm24_status |= FM24_AWAKE; #endif return EXIT_SUCCESS; }
void mcp_dac_write(uint8_t address, uint16_t value) { /* Prepare the buffer */ /* we always perform writes (R/W bit is 0) */ buffer[0U] = address; buffer[1U] = (uint8_t)(((uint16_t)(value >> 8U)) & 0x0FU); buffer[2U] = (uint8_t)((uint16_t)(value)); /* Update the DAC register using the Fast Mode */ i2c_transfer_set_data(buffer, 3U); i2c_transfer_start(); i2c_transfer_successful(); }
uint32_t fm24_write(uint8_t * data, const uint32_t addr, const uint32_t data_len) { uint8_t rv = 0; uint8_t retry; uint32_t c_addr; uint8_t i2c_buff[2]; // in case a seek beyond the end of device is requested // we roll to the beginning since this memory is circular in nature if (addr > FM_LA) { c_addr = addr % FM_LA - 1; } else { c_addr = addr; } m.e = addr; i2c_buff[0] = (c_addr & 0xff00) >> 8; i2c_buff[1] = c_addr & 0xff; pkg.slave_addr = FM24_BA | (c_addr >> 16); pkg.addr = i2c_buff; pkg.addr_len = 2; pkg.data = data; pkg.data_len = data_len; pkg.options = I2C_WRITE; for (retry = 0; retry < FM24_MAX_RETRY; retry++) { #ifdef HARDWARE_I2C i2c_transfer_start(&pkg, NULL); #else rv = i2cm_transfer(&pkg); if (rv == I2C_ACK) { m.e += data_len; if (m.e > FM_LA) { m.e = m.e % FM_LA - 1; } break; } #endif } #ifdef FM24_HAS_SLEEP_MODE fm24_status |= FM24_AWAKE; #endif return 0; }
uint8_t fm24_seek(const uint32_t addr) { uint8_t rv = 255; uint8_t retry; uint32_t c_addr; uint8_t i2c_buff[2]; i2c_package_t pkg; // in case a seek beyond the end of device is requested // we roll to the beginning since this memory is circular in nature if (addr > FM_LA) { c_addr = addr % FM_LA - 1; } else { c_addr = addr; } i2c_buff[0] = (c_addr & 0xff00) >> 8; i2c_buff[1] = c_addr & 0xff; pkg.slave_addr = FM24_BA | (c_addr >> 16); pkg.addr = NULL; pkg.addr_len = 0; pkg.data = i2c_buff; pkg.data_len = 2; pkg.options = I2C_WRITE; for (retry = 0; retry < FM24_MAX_RETRY; retry++) { #ifdef HARDWARE_I2C i2c_transfer_start(&pkg, NULL); #else rv = i2cm_transfer(&pkg); if (rv == I2C_ACK) { break; } #endif } if (rv != I2C_ACK) { return EXIT_FAILURE; } #ifdef FM24_HAS_SLEEP_MODE fm24_status |= FM24_AWAKE; #endif return EXIT_SUCCESS; }