ALIENTEK MINISTM32 实验19 IIC实验中
myiic.c文件中的这个函数
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
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();
else
IIC_Ack();
return receive;
}
我参考这份代码去写读取MPU6050的数据时发现了问题,就是读取数据的时候出现偏移,就是读取到的数据本来应该是0x68,但是实际中读取到的数据可能是0xD0,分析之后我认为是因为多移动了一位,因为循环了8次,在第八次的时候(i=7时)是不需要移位的,修改成如下代码就正常了
if(READ_SDA)receive++;
if(i != 7) receive<<=1;
我认为这个函数是有问题的,但是我身边没有配套的器件来检测一下,有可能是这个函数和MPU6050不配套,也有可能是我下载的例程是没有更正过的。
附:
1.个人写的这个函数(MSP430的)
/***********************************************
功能:接收一个字节
返回值:接收到的字节
***********************************************/
unsigned char IICReceiveByte()
{
unsigned char i,LDataReceive = 0x00;
SetSDAASInput;
for(i = 0; i < 8; i += 1)
{
SCL_OutputL;
//延时等待,这里暂时没写
delay(200);
SCL_OutputH;
//SDA_Input为高电平
if(SDA_Input) LDataReceive += 0x01;
if(i != 7)
LDataReceive <<= 1;
//延时等待,这里暂时没写
delay(100);
}
return LDataReceive;
}
2.截图例程
改成这样应该就不用判断 i=7了
unsigned char IICReceiveByte()
{
unsigned char i,LDataReceive = 0x00;
SetSDAASInput;
for(i = 0; i < 8; i += 1)
{
SCL_OutputL;
//延时等待,这里暂时没写
delay(200);
SCL_OutputH;
LDataReceive <<= 1;
//SDA_Input为高电平
if(SDA_Input) LDataReceive += 0x01;
//延时等待,这里暂时没写
delay(100);
}
return LDataReceive;
}
一周热门 更多>