136 lines
3.5 KiB
C
136 lines
3.5 KiB
C
#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);
|
||
|
||
|