起因:之前有一份代码移植到STM32F103上面,调试IIC的接口时,遇到了玄学。
目录
背景介绍
移植一份GD32F450操作IIC的代码到STM32F103上面,IIC是GPIO模拟的。代码在原有平台上可以正确操作IIC设备,但是在STM32单片机上面无法正常操作设备,会报ack等待超时的错误,经过排查,可以确定,代码移植是没有问题的,和GD32的代码完全一致。
问题原因
通过逻辑分析仪查看数据,一个个字节的和代码比对。最终发现IIC发送的数据和应该发送的数据不一样!
IIC发送的一个字节的最高位如果为1的话,会被强制改成0。现把接口部分的源代码放在下面,注意,代码是没有问题的。
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
u8 temp = 0;
SDA_OUT();
IIC_SCL0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if(((txd&0x80)>>7) == 1)
IIC_SDA1;
else
IIC_SDA0;
txd<<=1;
delay_us(IIC_TRANSFER_DELAY); //对TEA5767这三个延时都是必须的