我在G2553上使用模拟I2C,一切正常,可以使用,尤其是主机接收从机应答部分的波形。但是把相同的程序移植到F5438以后,应答部分波形变得很奇怪。SCL自己先拉高,然后在SDA拉高前,SCL拉低。
但是正常主机接收从机应答,应该是
1.主机拉高SDA电平,然后释放SDA线。
2.SCL由低电平转为高电平并保持,然后读取SDA的电平。
3.若是从机应答,则这时SDA应被拉低。
4.然后SCL变为低电平。
5.最后SDA再被主机控制,并置为低电平。接收应答结束。
应该是按以上的步骤吧?可是换到F5438上就不是这样了,变成:SDA未拉高并释放。时钟就完成了应答时序。
下附我模拟I2C,检查从机的应答操作的程序。附图中上图是G2553的时序(正确),下图是F5438的时序。
试修改程序还是不行。求助各位专家啊啊啊
/*******************************************
函数名称:check
功 能:检查从机的应答操作
参 数:无
返回值 :从机是否有应答:1–有,0–无
********************************************/
void check(void)
{
uchar slaveack;
SDA_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP(); SCL_H;
_NOP(); _NOP(); slaveack = SDA_val; //读入SDA数值
while(slaveack)
{
slaveack = SDA_val;
}
SCL_L;
delay();
SDA_out;
}
一些宏定义
#define SCL_H P1OUT |= BIT7
#define SCL_L P1OUT &= ~BIT7
#define SDA_H P1OUT |= BIT6
#define SDA_L P1OUT &= ~BIT6
#define SDA_in P1DIR &= ~BIT6 //SDA改成输入模式
#define SDA_out P1DIR |= BIT6 //SDA变回输出模式
#define SDA_val P1IN&BIT6 //SDA的位值
#define SCL_out P1DIR |= BIT7#define TRUE 1
#define FALSE 0
step by step:
楼主,
首先5438已经不推荐在新设计中使用了,所以建议楼主更换到5438A上试试。其次我理解楼主的问题是不是SDA_H;并没有将SDA脚拉高?建议可以断开所有连接进行测试,看看SDA_H;能否将SDA管脚置高,以证实是否5438本身IO管脚的原因还是和连接的I2C设备有关。
SMITH LEON:
回复 step by step:
请问为什么不在推荐中使用?有什么缺陷吗?
那个问题我刚解决了,貌似因为IO驱动能力不足。我把P1DS打开就可以了