继昨天BSRR问题导致的新问题.关于BSRRH,BSRRL对引脚的电平设置

2019-07-21 00:43发布

在昨天发现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的理解有误.

请大虾指点.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
lvehe
1楼-- · 2019-07-21 05:10
 精彩回答 2  元偷偷看……
包子
2楼-- · 2019-07-21 06:50
回复【2楼】lvehe:
---------------------------------
嗯,我查了下,是我昨天理解你意思理解错了.  我以为他们很人性化的直接就可以置电平,所以HL理解为电平了. 
  
/*————————————————————————————————————————*/
做一下解释给后来的朋友如果看到这个问题:

其实这里H是指高16位的BRy即BSRR位16-位31(对应引脚口0-15).哪一个BRy置1引脚口就会置0 即输出低电平.   

反之,BSy就是BSRR的低16位.(也是对应引脚口0-15),哪一位BSy置1引脚口就会置1 即输出高电平.

/*————————————————————————————————————————*/

我这里已经把MPU6050的参数读出来了.各部分问题也明白了,谢谢 Lvehe 吖,真的很热心呢+1.

一周热门 更多>