(未解决)STM32软件IIC配置时GPIO基本问题(库函数&寄存器)
本帖最后由 与龙共舞 于 2018-6-29 09:24 编辑hi 今天问一个基础问题,看上去不难的但是。。。没办法我不清楚。
拿出来问问。
我的问题是:库函数我理解,寄存器看不懂
软件模拟IIC通讯的时候,其中SDA这个脚的需要切换OUT还是IN两种模式的,
以前我是用库函数,就像下面这样
//SDA脚设置为OUT
void I2C_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIO_I2C,&GPIO_InitStructure);
}
//SDA脚设置为IN
void I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIO_I2C,&GPIO_InitStructure);
}今天看原子的代码,他用的寄存器写的
//IO方向设置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}我仔细看了看,因为他用的是PB7,所以最后是4*7=28这样来的。
但是(u32)3<<28;这个??
参考:http://forum.eepw.com.cn/thread/286105/1
3其实是11 对应的是不是GPIO_Mode_Out_PP而是开漏输出呀。。。。。
前面 SDA_IN()这句也是看不懂 。OUT是11为啥IN是1000呢?
个人认为,软件模拟IIC通讯其实只要是IO口配成输出模式就可以了,仅需要IO口有高低电平变化,所以配置成复用输出,也是可以输出高低电平的。另外,之所以开漏输出也可以,大概是因为,一般电路设计SDA这个脚都会有上拉电阻的。 这个我没有试过,但是有一个思路可以参考。假如用的是开路输出,也就是IO口的两个状态分别是低电平和高阻态,高阻态配合上拉电阻产生高电平。那么在你的IO口为高阻态的时候,既可以做高电平输出,同时也可以作为输入,从机输出低电平的时候,由于上拉电阻的阻值很大,所以实际上线路上是低电平,只要读取IO口的电平状态就相当于输入了。 OUT问题不大,IN有讲究。不过,也可以试试使用位绑定的方法。 超赞,谢谢分享! 本帖最后由 xiajintaord 于 2018-6-28 09:36 编辑
3楼说的是对的,SDA 线的 IO 口直接配置为开漏输出即可
SPI 输出时操作输出数据寄存器 GPIOx_ODR 指定位
SPI 输入时读取输入数据寄存器 GPIOx_IDR指定位
GPIO 配置为输出之后,IO 口的输入寄存器还是在工作的,直接读取就可以了。
The input data register (GPIOx_IDR) captures the data present on the I/O pin at every AHB
clock cycle.
问题未解决,楼上几位的回复有帮助吗?
页:
[1]