使用STM32f103C8T6配置IIC通信端口PB6/PB7
PB6-SCL(OUT)/PB7-SDA(IN/OUT)
SCL输出脉冲
SDA发送数据和接收数据
配置GPIOB时钟-APB2ENR
1<<3,左移三位将GPIO_B时钟置1开启时钟
配置GPIOB端口配置低寄存器-CRL清零
&=0x00ffffff清零
初始化函数配置端口
PB6(SCL)输出模式50Mhz/通用推挽输出
PB7(SDA)输出模式50Mhz/通用推挽输出
这里仅仅是初始化,通信过程中端口模式会发生变化,由其他函数配置
0x33000000配置
GPIOB端端口输出数据寄存器(GPIOx_ODR) 初始化配置为高
将SCL和SDA拉高
IIC_SCL=1;
IIC_SDA=1;
-----------------------------------
具体定义
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
IIC_GPIO.c程序
#include "IIC_GPIO.h"
/*
*PB6-SCL(OUT)/PB7-SDA(IN/OUT)
*
*/
void IIC_GPIO_Init(){
RCC->APB2ENR|=1<<3; //使能GPIOB时钟
GPIOB->CRL&=0x00ffffff; //PB6.7清零
GPIOB->CRL|=0x33000000; //PB6.7推挽输出
GPIOB->ODR|=0x000000c0; //PB6.7输出高
//总线拉高
IIC_SCL=1;
IIC_SDA=1;
}
SDA模式配置
在通信过程中SDA是数据线要进行发送和接受,对应的GPIO口需要输出和输入两种模式
配置如下
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}
与运算清零,或运算进行配置
#define READ_SDA PBin(7) //##输入SDA
在头文件中IIC_GPIO.h
#ifndef __IIC_GPIO_H
#define __IIC_GPIO_H
#include "sys.h"
//PB6-SCL(OUT)/PB7-SDA(IN/OUT)
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //##输入SDA
void IIC_GPIO_Init();
#endif