doubao_chat/apps/common/example/peripheral/iic/main.c

136 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_config.h"
#include "system/includes.h"
#include "device/device.h"
#include "device/iic.h"
#define IIC_WRCMD 0x42 //IIC写地址命令
#define IIC_RDCMD 0x43 //IIC读地址命令
static int iic_write_one_byte(void *iic, unsigned char addr, unsigned char data)//返回值为0成功,非0失败
{
int ret = 0;
dev_ioctl(iic, IIC_IOCTL_START, 0);//IIC锁定
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, IIC_WRCMD)) {//起始信号 + 写地址命令
ret = -1;
printf("iic write err in IIC_IOCTL_TX_WITH_START_BIT \n");
goto exit;
}
delay(1000);
if (dev_ioctl(iic, IIC_IOCTL_TX, addr)) {//写地址
ret = 0 - 1;
printf("iic write err in IIC_IOCTL_TX\n");
goto exit;
}
delay(1000);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_STOP_BIT, data)) {//写数据 + 结束信号
ret = -1;
printf("iic write err in IIC_IOCTL_TX_WITH_STOP_BIT\n");
goto exit;
}
delay(1000);
exit:
dev_ioctl(iic, IIC_IOCTL_STOP, 0);//IIC解锁
return ret;
}
static int iic_read_one_byte(void *iic, unsigned char addr, unsigned char *data)//返回值为0成功,非0失败
{
int ret = 0;
dev_ioctl(iic, IIC_IOCTL_START, 0);//IIC锁定
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, IIC_WRCMD)) {//起始信号 + 读地址命令
ret = -1;
printf("iic write err in IIC_IOCTL_TX_WITH_START_BIT\n");
goto exit;
}
delay(1000);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_STOP_BIT, addr)) {//读地址 + 结束信号
ret = -1;
printf("iic write err IIC_IOCTL_TX_WITH_STOP_BIT\n");
goto exit;
}
delay(1000);
if (dev_ioctl(iic, IIC_IOCTL_TX_WITH_START_BIT, IIC_RDCMD)) {//起始信号 + 读数据命令
ret = -1;
printf("iic write err IIC_IOCTL_TX_WITH_START_BIT\n");
goto exit;
}
delay(1000);
#if 1
//接收没有ACK:IIC_IOCTL_RX_WITH_STOP_BIT,读数据 + 结束信号
dev_ioctl(iic, IIC_IOCTL_RX_WITH_STOP_BIT, (u32)data);//读数据 + 结束信号
#else
//接收需要ACK,则命令为 IIC_IOCTL_RX_WITH_ACK,如下:
dev_ioctl(iic, IIC_IOCTL_RX_WITH_ACK, (u32)data);//读数据 + ACK
dev_ioctl(iic, IIC_IOCTL_TX_STOP_BIT, 0);//结束信号
#endif
exit:
dev_ioctl(iic, IIC_IOCTL_STOP, 0);//IIC解锁
return ret;
}
static void iic_test_task(void *p)
{
//1.打开iic0的iic设备
void *iic_hdl = dev_open("iic0", NULL);
if (!iic_hdl) {
printf("iic open err \n");
goto exit;
}
u8 addr = 0x28;
u8 data = 0x03;
u8 id_addr = 0xf0;
u8 id = 0;
os_time_dly(2);//延时2个os tick
//2.读取ID
iic_read_one_byte(iic_hdl, id_addr, &id);
if (id != 0x9d) { //ID为设备的ID好
printf("err id no match \n");
goto exit;
}
printf("dev id match = 0x%x \n", id);
//3.对应地址写对应数据
iic_write_one_byte(iic_hdl, addr, data);
//4.对应地址写对应数据
data = 0;
iic_read_one_byte(iic_hdl, addr, &data);
if (data != 0x03) { //写进去之后读取值进行比较
printf("read no match \n");
goto exit;
}
printf("write read test ok\n");
exit:
if (iic_hdl) { //关闭iic设备
dev_close(iic_hdl);
printf("dev close \n");
}
while (1) { //等待其他任务杀此任务
os_time_dly(100);
}
printf("iic_test_task exit \n");
}
static int c_main(void)
{
os_task_create(iic_test_task, NULL, 12, 1000, 0, "iic_test_task");
return 0;
}
late_initcall(c_main);