大家好,我现在来说明一下关于IIC协议中,SDA_IN()与SDA_OUT()如何配置,大家可以放心食用,因为这是我亲身实践过的,有什么问题可以私信我!!
IIC协议我就不仔细介绍了,大家可以观看其他厉害的博主学习,我们只需要知道它有两根线数据线与时钟线,以及它是怎么通讯的就行了。对于配置SDA_IN()与SDA_OUT()我已经实践出两种方法,第三种方法已经编写完成了,但是还没实践就不分享给大家了。
第一种方法
使用寄存器移位就可以解决咯代码如下:
#define SDA_IN() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=(u32)8<<24;}
#define SDA_OUT() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=(u32)3<<24;}
接下来给大家简单解释一下意思,我配置的引脚是PB14,14在寄存器里处于高位所以要用CRH,如果是0-7的引脚则是CRL,至于8和3的意思代表的是二进制的10 与 11,24是怎么算的呢?看前面0xf0fffff中0的位置,从0开始算从左往右算到最后距离多少个的数再×4,8位一字节,占据了4位,其中0xf0fffff的算法是看你的引脚,我这里是14,这一串是8-15的引脚,对应的那个引脚就那个为0。我讲的很简单,具体可以看其他博主的教学,讲的很好我也是在学习的链接如下:
https://blog.csdn.net/weixin_44970820/article/details/130829463
第二种方法
直接暴力执法,代码如下:
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
第三种方法我就不演示给大家看了,也是操作寄存器但是我还没有实践,有什么问题大家可以评论!!