在昨天发现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的理解有误.
请大虾指点.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
嗯,我查了下,是我昨天理解你意思理解错了. 我以为他们很人性化的直接就可以置电平,所以HL理解为电平了.
/*————————————————————————————————————————*/
做一下解释给后来的朋友如果看到这个问题:
其实这里H是指高16位的BRy即BSRR位16-位31(对应引脚口0-15).哪一个BRy置1引脚口就会置0 即输出低电平.
反之,BSy就是BSRR的低16位.(也是对应引脚口0-15),哪一位BSy置1引脚口就会置1 即输出高电平.
/*————————————————————————————————————————*/
我这里已经把MPU6050的参数读出来了.各部分问题也明白了,谢谢 Lvehe 吖,真的很热心呢+1.
一周热门 更多>