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

请大虾指点.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。