/* * drv_i2c.c * * Created on: Mar 31, 2023 * Author: gxms0 */ #include "drv_i2c.h" #include "stdbool.h" static I2C_t *root = NULL; I2C_t i2c1; void i2c_init() { i2c_config(&i2c1, "I2C1",&hi2c1, i2c_Address_8bit); } void i2c_config(I2C_ptr e,char *name, I2C_HandleTypeDef *hi2c, uint8_t addr_len) { e->hi2c = hi2c; e->addr_len = addr_len; e->next_ptr = NULL; e->name = name; if (root) { I2C_t *last = root; while (last->next_ptr) { last = last->next_ptr; } e->channel = last->channel + 1; last->next_ptr = e; } else { e->channel = 0; root = e; } } uint16_t i2c_read(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len) { /* if (len < 4) { if (!HAL_I2C_Mem_Read(ptr->hi2c, address, reg, len,data,len,100)) { return len; } } else if (i2c_dev->bus->mode == I2C_BUS_DMA) { if (!HAL_I2C_Mem_Read_DMA(i2c_dev->bus->hi2c, i2c_dev->addr, MemAddress, MemAddSize, buff_out, len_out)) { if (ulTaskNotifyTake( pdTRUE, 100)) { if (i2c_dev->bus->task_waitfor_ret) { return true; } } else { i2c_dev->bus->task_waitfor_cmpl = NULL; } } } else { if (!HAL_I2C_Mem_Read_IT(i2c_dev->bus->hi2c, i2c_dev->addr, MemAddress, MemAddSize, buff_out, len_out)) { if (ulTaskNotifyTake( pdTRUE, -1)) { if (i2c_dev->bus->task_waitfor_ret) { return true; } } else { i2c_dev->bus->task_waitfor_cmpl = NULL; } } } return false; return i; */ } uint16_t i2c_write(I2C_ptr ptr, uint16_t address, uint16_t reg,uint8_t *data, uint16_t len) { uint8_t buff2send[128]; uint8_t buff_size = len; // while( I2C_GetFlagStatus( ptr->I2C, I2C_FLAG_BUSY ) != RESET ); // I2C_GenerateSTART( ptr->I2C, ENABLE ); // while( !I2C_CheckEvent( ptr->I2C, I2C_EVENT_MASTER_MODE_SELECT )); // I2C_Send7bitAddress( ptr->I2C, address, I2C_Direction_Transmitter); // while( !I2C_CheckEvent( ptr->I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED )); // if(ptr->addr_len == i2c_Address_8bit) // { // buff2send[0] = reg&0x00FF; // memcpy(buff2send + 1,data,len); // buff_size += 1; // } // else // { // buff2send[0] = (reg&0xFF00) >> 8; // buff2send[1] = reg&0x00FF; // memcpy(buff2send + 2,data,len); // buff_size += 2; // } uint16_t i = 0; // for(; i < buff_size;i++) // { // I2C_SendData( ptr->I2C, buff2send[i]); // while( !I2C_CheckEvent( ptr->I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) ); // } // I2C_GenerateSTOP( ptr->I2C, ENABLE ); return i; }