IIC实验感想
程序员文章站
2024-02-09 16:11:52
...
初始化SDA数据线和SCL时钟线
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//使能GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PB6,PB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB13,PB14 输出高
}
通过操作IO对应的寄存器GPIOx->CRL(CRH),改变SDA是输入还是输出,8的二进制是1000,左移28位在寄存器CPL上对IO口7进行操作,10且为上下拉输入,00代表为输入模式;3=0011右移28位,00表示通用推挽输出,11表示输出模式
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}//上/下拉输入
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}//通用推挽输出
//IO操作函数
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //输入SDA