在线时间0 小时
UID1640147
ST金币8
蝴蝶豆0
注册时间2020-8-6
该用户从未签到
新手上路
- 最后登录
- 2020-8-6
|
发表于 2020-8-6 15:27:05
|
显示全部楼层
楼主你好,最近我也在研究VCNL4040,但是我这边I2C通讯异常,主要是没有接收到对面发来的ACK从第一次发送 地址(0X60) 就没有收到,后续无论是收发数据都没收到ACK .
附上我的软件,波形图(开始+发生地址),以及硬件原理图,希望得到楼主的帮助,谢谢! 另外我用的是PIC的MCU,IO的写法稍微有点区别.
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA=1;
IIC_SCL=1;
__delay_us(4);
IIC_SDA=0;
__delay_us(4);
IIC_SCL=0;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
__delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
__delay_us(4);
}
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SDA_IN();
IIC_SDA=1;__delay_us(1);
IIC_SCL=1;__delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
__delay_us(2);
IIC_SCL=1;
__delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
__delay_us(2);
IIC_SCL=1;
__delay_us(2);
IIC_SCL=0;
}
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
__delay_us(2); //对TEA5767这三个延时都是必须的
IIC_SCL=1;
__delay_us(2);
IIC_SCL=0;
__delay_us(2);
}
}
uint8_t IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
__delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
__delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
void VCNL4040_WrData(uint8_t cmd,uint8_t data_L,uint8_t 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();//产生一个停止条件
}
uint16_t VCNL4040_RdData(uint8_t cmd)
{
uint16_t data=0,data_H=0;
uint16_t 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(1);//读出16位数据中的低八位,应答
data_H=IIC_Read_Byte(0);//读出16位数据中的高八位,不应答
IIC_Stop();//产生一个停止条件
data = data_L+data_H*256;//16bit数据
return data;
}
|
|