在昨天发现BSRR这个写法在STMF4中并不应用了,而是改成了BSRRH,BSRRL.
于是这么写了
#define SCL_H GPIOB->BSRRH = GPIO_Pin_6
#define SCL_L GPIOB->BSRRL = GPIO_Pin_6
·········
while(1)
{
delay_ms(1000);
SCL_H;
SDA_H;
delay_ms(1000);
SCL_L;
SDA_L;
}
然后用示波器查看引脚口波形, 可以看到每隔一秒就会翻转一次. 于是很高兴的拿着自己的I2C,丢进去.
结果是,嗯,很好,依旧是老朋友——不行.(同样的I2C写法我在F1是可以用的,只是当了下copy忍者So,这部分应该是可以得).
很好,我于是单独去测试I2C_Start(),先贴出I2C,代码.
bool I2C_Start(void)
{
SDA_H;
SCL_H;
delay_us(4);
if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
delay_us(4);
if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
delay_us(4);
return TRUE;
}
··················
在Main中while里是这么执行的:temp初始值为2.
temp = I2C_Start();
if(temp == 1) printf("应答为TURE");
else if(temp == 0) printf("应答为FLASE");
else printf("无应答");
串口返回的数据为:应答为FLASE 示波器持续低电平.
于是我看了下,我在I2C中已经用了SCL_H(在之前的测试中也是有翻转的.)于是摸不着头脑. 我把SCL_H改成了SCL_L,很好.这次确实变成了高电平了. 那么问题来了.SCL_H关联的是BSRRH为什么是置引脚口低电平? SCL_L关联的是BSRRL,却是置高. 请问是否是头文件中的一个错误?还是我哪里对BSRRH,BSRRL的理解有误.
请大虾指点. |