1、IIC初始化
1.使能时钟
GPIOB:RCC_APB2PeriphClockCmd();
I2C1:RCC_APB1PeriphClockCmd();
2.初始化gpio
SCL:GB6,复用开漏
SDA:GB7,复用开漏
GPIO_Init();
3.初始化I2C外设
时钟频率:400KHz(400000)
模式:I2C模式
占空比:I2C_DutyCycle_2
自身地址:0x5f(7位地址)
应答:使能
应答位数:7位
I2C_Init();
4.使能I2C外设
I2C1:I2C_Cmd();
2、收发数据函数
2.1发一个字节
1.发送一个起始信号,并检测EV5事件
2.发送8位写地址,并检测EV6事件(EV8可检测可不检测)
3.发送存储单元地址,并检测EV8事件
4.发送数据,并检测EV8_2事件
5.发送停止信号
2.2发多个字节(最大一次发8个)
void EEPROM_page_write(uint8_t addr,uint8_t *data,uint8_t num)
1.前3步一样
发起始信号,发地址,发存储地址
2.发送多个数据
发送数据后,检测EV8事件,然后个数减数据地址加
个数减到0跳出循环
3.发停止信号
2.3读多个字节
void EEPROM_read(uint8_t addr,uint8_t *data,uint8_t num)
1.前3步一样
发起始信号,发写地址,发存储地址
2.在次发送起始信号,检测EV5事件
3.发送8位读地址,并检测EV6事件
参数2选择接收方向,检测读的
4.读取多个数据
判断是否读最后一个数据:是关闭应答,否往下执行
接收数据后,先检测EV7事件,然后读取数据到数组地址
个数减,地址加
个数减到0跳出循环
5.发停止信号并且开应答
3、等待EEPROM存储数据结束
1.发起始信号
2.检测起始位标志位SB,也就是EV5事件
3.发地址
4.检测地址发送标志位(主模式)“ADSL”,ADDR,也就是EV6事件
5.未检测到ADDR继续发送起始信号
6.检测到ADDR发送停止信号
4、发送数据到EEPROM,然后读出数据利用串口1发送到电脑
1.定义2个数组
1个输入8个数据(因为EEPROM一次性只能接收8个数据)
1个数据初始化为0
2.初始化外设
初始化串口和IIC
3.发数组到EEPROM
4.等待EEPROM接收完成
5.读EEPROM
只能8位的读(地址是8的倍数),不然会出错(EEPROM)
比如地址是8,16,24,32
6.利用串口发送到电脑