新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2020-5-29
- 在线时间
- 15 小时
|
1金钱
本帖最后由 13886419675 于 2020-7-27 16:27 编辑
最近项目用到一款接近光传感器VCNL4040,在连续读16位数据的时候,发现低八位读出来是正确的,但是高八位读出来的都是0xFF。我看Datasheet上面每次读完数据之后都是主机主动应答,程序也是这么写的,但最后的结果还是不对。不知道论坛里面大佬们知道是什么问题吗???救救孩子吧
这是Datasheet读写流程。- void VCNL4040_WrData(uchar cmd,uchar data_L,uchar data_H)
- {
- IIC_Start();
-
- IIC_Send_Byte(Write_SlaveAddress);//写模式
- IIC_Wait_Ack();
- IIC_Send_Byte(cmd);//发送命令代码
- IIC_Wait_Ack();
-
- IIC_Send_Byte(data_L);//发送数据低八位
- IIC_Wait_Ack();
- IIC_Send_Byte(data_H);//发送数据高八位
- IIC_Wait_Ack();
-
- IIC_Stop();//产生一个停止条件
- }
- //函数名称:VCNL4040_RdData(uchar cmd)
- //功能描述: 从VCNL4040指定命令代码中读出16位数据
- //参数说明:Cmd为指定命令代码
- //-----------------------------------------------------------------------------------------
- u16 VCNL4040_RdData(uchar cmd)
- {
- u16 data=0,data_H=0;
- u16 data_L=0;
-
- IIC_Start();//产生一个开始条件
-
- IIC_Send_Byte(Write_SlaveAddress);//写操作
- IIC_Wait_Ack();
-
- IIC_Send_Byte(cmd);//发送命令代码
- IIC_Wait_Ack();
-
- IIC_Start();
- IIC_Send_Byte(Read_SlaveAddress);//读操作
- IIC_Wait_Ack();
-
- data_L=IIC_Read_Byte(0);//读出16位数据中的低八位
- IIC_Ack();
- data_H=IIC_Read_Byte(0);//读出16位数据中的高八位
- IIC_Ack();
-
- IIC_Stop();//产生一个停止条件
-
- data = data_L+data_H*256;//16bit数据
-
- return data;
- }
复制代码
上面是我写的读写函数
- //产生ACK应答
- void IIC_Ack(void)
- {
- IIC_SCL_LOW;
- IIC_SDA_Init(0);
- IIC_SDA_LOW;
- delay_us(2);
- IIC_SCL_HIGH;
- delay_us(2);
- IIC_SCL_LOW;
- }
复制代码 这是IIC的ACK应答函数。确实没看出问题到底出在哪里啊
|
-
最佳答案
查看完整内容[请看2#楼]
问题解决了,原来正点原子里面的读函数是包含响应函数与不响应函数的
将VCNL4040_RdData()中多余的响应函数注释掉之后,修改为
亲测可以正确读取设备ID,还是看代码不仔细的锅啊
|