实验目的
本实验向大家介绍如何使用STM32的IIC硬件接口,实现和24C02之间的双向通信,通过本实验的学习,我们将对IIC通信的过程会有一个详细的了解。
实验简介
IIC简介
IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及外围设备。它是由数据线SDA和时钟线SCL构成的串行总线,可用于发送和接收数据。在CPU与被控IC之间,IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上,但是目前大多数IIC设备不支持高速IIC。
使用IIC总线通信时,只需要2根通信线,一条双向串行数据线(SDA),一条串行时钟线(SCL)。每个IIC设备都有一个独立的地址,主机可以利用这个地址进行不同设备间的访问。当多主机使用总线时,IIC有一个仲裁机制,会决定由那个主机使用总线。
IIC总线协定如下:
- 只有在总线空闲时才允许启动数据发送。
- 在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变。时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
IIC在数据通信过程中共有3种信号,分别是起始信号,停止信号和应答信号。
**起始信号:**时钟线(SCL)保持高电平期间,数据线(SDA)电平从高到低跳变作为I2C总线的起始信号。
**停止信号:**时钟线(SCL)保持高电平期间,数据线(SDA)电平从低到高的跳变作为I2C总线的停止信号
**应答信号:**接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,则判断为受控单元出现故障。
器件简介
本实验所用IIC器件为非易失性存储器EEPROM——AT24C02,容量为256字节,可擦写100万次,掉电数据不会丢失,通常被用来保存一些用户数据。这个系列芯片容量可以达到1Mbit,即128K字节,如AT24C1024.
AT24C02的管脚配置如下,关于这个芯片详细介绍请参看数据手册:
电路设计
星光STM32F103开发板采用的EEPROM芯片为AT24C02,容量为256字节,这里我们把A0-A2均接地,也就是将AT24C02的地址设为0,写程序时要注意这点,连接到STM32的I2C2,对应管脚PB10,PB11,电路如图所示
代码
main.c
#include "MyIncludes.h"
u16 sys_cnt = 0;
void systick_isr(void)
{
if(sys_cnt < 1000)
{
sys_cnt++;
}
else
{
sys_cnt = 0;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_4|GPIO_PIN_5);
}
}
u8 Wr_Buf[100];
//写缓冲器
u8 Rd_Buf[100];
//读缓冲器
int main()
{
u16 i;
System_Init();
LED_Init();
SysTick_Init(systick_isr);
USART1_Init(115200,NULL,NULL);
printf("EEPROM ReadWrite Test\n");
while(EEPROM_Init()!=EEPROM_OK)
{
printf("EEPROM Init ERROM\n");
}
//当EEPROM初始化未完成
//输出EEPROM Init ERROM
for(i=0; i<100; i++)
{
Wr_Buf[i]