目录
前言
I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
物理I2C接口有两根双向线,串行时钟线(SCL)和串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。
-
启动条件:
SCL高的时候SDA从高到低的过渡是一个启动条件。 -
停止条件:
SCL高的SDA从低到高的转变是停止条件。在读取序列之后,stop命令将EEPROM置于备用电源模式。
蓝桥杯在资料包里会给我们iIC的驱动文件,我们只需要将驱动文件添加到自己的工程里使用
1.stm32cubemx设置
我们在使用cubemx是一定要初始化PB端口的一个引脚,目的是使能PB端口
系统时钟的设置
2.代码实现
1.主要使用的函数
void I2CStart(void);//开启iIC
void I2CStop(void);//停止iIC
unsigned char I2CWaitAck(void);//等待iIC的相应void I2CSendByte(unsigned char cSendByte);//发送数据
unsigned char I2CReceiveByte(void);//读取数据
void I2CInit(void);//初始化iIC
void x24c02_w(unsigned char address,unsigned char info);//向eeprom写入数据(用户自己编写)
uint8_t x24c02_r(unsigned char address);//读取eeprom数据(用户自己编写)
我们需要注意存储地址是八位,所以存储地址是0到0xff,每个地址存储的大小是八位,所以存储的数据是从0到255(如果你没有使用向eeprom里存储东西,默认值是255)
//将数据写入eeprom
void x24c02_w(unsigned char address,unsigned char info)
{
I2CStart();
I2CSendByte(0xa0);//向所有从机发送eeprom的设备地址即模式(只有eeprom会相应)
I2CWaitAck();//等待响应
I2CSendByte(address);//发送所要存储的地址
I2CWaitAck();
I2CSendByte(info);//发送存储数据
I2CWaitAck();
I2CStop();
}
//读取目的地址eeprom的数据
uint8_t x24c02_r(unsigned char address)
{
unsigned char val;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);//更改eeprom的模式,设置成读
I2CWaitAck();
val=I2CReceiveByte();//接收读取的数据
I2CStop();
return val;
}
2.示例
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t Num=10;
uint8_t str[20];
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//¹Ø±ÕËø´æÆ÷±£³ÖledµÄ״̬
I2CInit();
LCD_Init();
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Black);
x24c02_w(0x00,10);
HAL_Delay(10);//使用发现这里放延时函数十分有必要,可以短一些,特别是下一步就开始读的时候
Num=x24c02_r(0x00);
LCD_DisplayChar(Line5, 320-(10*16), Num+'0');
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
我们可以直接初始化eeprom里面的数据为0,使用for循环实现