1、我们直接调用官方的库即可,主要以下几个函数
//I2C初始化
//i2cx:I2C编号,只有一个I2C所以为0
//freq: I2C频率,单位HZ
int hal_i2c_init(int i2cx, int freq)
//I2C写数据
//address: 从机地址
//data: 读缓存
//length: 要读取的字节数
//subaddr_len: 寄存器地址的长度(字节)
//subaddr: 寄存器地址
int hal_i2c_write_block(int address, const char *data, int length, int subaddr_len, int subaddr)
//I2C读数据
//address: 从机地址
//data: 读缓存
//length: 要读取的字节数
//subaddr_len: 寄存器地址的长度(字节)
//subaddr: 寄存器地址
int hal_i2c_read_block(int address, char *data, int length, int subaddr_len, int subaddr)
2、这些函数属于hal_drv模块,因此我们需要把工程路径下的Makefile文件中的INCLUDE_COMPONENTS字段添加hal_drv
3、在aos_loop_proc函数中调用loopset_i2c_hook_on_looprt
否则会以下错误
[ASSERT] [ERR] bloop_base.c:261
4、创建一个I2C任务,循环读写EEPROM数据
#define I2C_SLAVE_ADDR (0xA0 >> 1)
/********************************************************************
*@brief I2C任务
*@input
*@return
********************************************************************/
static void user_i2c_task(void *arg)
{
//设置I2C管脚,IO4=SCL IO3=SDA
uint8_t gpiopins[2]={GLB_GPIO_PIN_4,GLB_GPIO_PIN_3};
GLB_GPIO_Func_Init(GPIO_FUN_I2C, gpiopins, sizeof(gpiopins));
//I2C初始化
//i2cx:I2C编号,只有一个I2C所以为0
//freq: I2C频率,单位HZ
hal_i2c_init(0, 100000);
while(1)
{
vTaskDelay(1000/portTICK_RATE_MS);
int i = 0;
uint8_t test_arr[5];
uint8_t recv_arr[5];
for (i = 0; i < sizeof(test_arr); i++) {
test_arr[i] = i;
}
for (i = 0; i < sizeof(recv_arr); i++) {
recv_arr[i] = 0;
}
int flag;
//address: 从机地址
//data: 读缓存
//length: 要读取的字节数
//subaddr_len: 寄存器地址的长度(字节)
//subaddr: 寄存器地址
flag = hal_i2c_write_block(I2C_SLAVE_ADDR, (char *)test_arr, sizeof(test_arr), 1, 0x04);
if(flag != 0)
{
printf("hal_i2c_write_block:%d\r\n",flag);
}
//eeprom在写入时应该是延迟的,然后才可以读取
vTaskDelay(20 / portTICK_PERIOD_MS);
//address: 从机地址
//data: 读缓存
//length: 要读取的字节数
//subaddr_len: 寄存器地址的长度(字节)
//subaddr: 寄存器地址
flag = hal_i2c_read_block(I2C_SLAVE_ADDR, (char *)recv_arr, sizeof(recv_arr), 1, 0x04);
if(flag != 0)
{
printf("hal_i2c_read_block:%d\r\n",flag);
}
if(memcmp(test_arr, recv_arr, sizeof(recv_arr)) != 0)
{
printf("recv_arr error\r\n");
for (i = 0; i < sizeof(recv_arr); i++) {
printf("test[%d] = %d recv_arr[%d] = %d \r\n", i, test_arr[i], i, recv_arr[i]);
}
}
}
vTaskDelete(NULL);
}
/********************************************************************
*@brief I2C初始化
*@input
*@return
********************************************************************/
void user_i2c_init()
{
xTaskCreate(user_i2c_task, "", 512, NULL, 2, NULL);
}