BL602 I2C的使用

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dear_Wally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值