① I2C(内部集成总线)
(1)SDK时钟线;
(2)SDA数据线;
(节省硬件资源)

② 传输协议(信号独立于数据):
(1)起始信号:SCL高电平时,SDA为下降沿时;
(2)结束信号:SCL高电平时,SDA为上升沿时;
(3)校验:握手(接收方应答):
< 1 > ACK:应答,数据线低电平;
< 2 > NACK:非应答,数据线高电平;
(1)时序:

< 1 > SCL:第1—7 bit 从设备地址 + 第8 bit 传输方向(0—主向从发,1 —从向主发)+ 第9 bit 校验位(应答);
----------------------------------------------------------------------------------------------
SDA:8 bit 有效数据 + 1 bit 校验位(应答);
< 2 >在时钟线的低电平进行数据线的电平变换;
< 3 >在时钟线的高电平进行锁存;
< 4 >数据格式高位在前(MSB);
③ 地址
(1)设备号(设备地址):
E2PROM:
< 1 > ROM只读存储器;
A . PROM (可编程存储器);
B . EPROM (可擦写编程存储器);
C . E2PROM (电信号可擦写编程存储器),存储量小,造价高;
Flash:
a . NorFlash ;
b . NandFlash ;
< 2 > RAM随机存储器;
A . SRAM (静态存储器),造价高;
B . DRAM (动态存储器),需要定时刷新(电容充电);
C . SDRAM ;
D . DDR ;
(2)设备内地址;
④ 端序
(1)大端序:高位在低地址;
(2)小端序:高位在高地址;
⑤E2PROM
(1)写:起始 + 设备号 + 传输方向(0) + 应答 + 从设备内地址 + 应答 + 多个数 据(从设备应答)+结束信号;
按字节写:每写一个地址,带一个地址;
按页写:大小1—16字节,跨页重发地址;
(2)读:起始 + 设备号 + 传输方向(0) + 应答 + 从设备内地址 + 应答 + 起始位 +设备号 + 传输方向(1) + 应答 + 多个数据(主设备应答)+ 主设备非应答 + 结束;
⑥ 使用I2C实现串口通信
代码:
#include "mapp.h"
#define E2PROM_ID 0xA0
#define E2PROM_Timeout 0xFFFF
int Layer = 0;
uint8_t Layer_Buf[4][100]={"Hello,world !\r\n", "Hello,Sean !\r\n", "Hello,Tom !\r\n", "Hello,Billy !\r\n"};
/********************
HAL¿âº¯Êý
*****************/
void e2prom_read(uint8_t madd,uint8_t *buf,uint32_t size)
{
HAL_I2C_Mem_Read(& hi2c1, E2PROM_ID,madd, 1,buf, size, E2PROM_Timeout);
HAL_Delay(2);
}
void e2prom_write(uint8_t madd,uint8_t *buf,uint32_t size)
{
uint32_t i;
for(i=0;i<size;i++)
{
//µ¥×Ö½Úд
HAL_I2C_Mem_Write(&hi2c1, E2PROM_ID, madd, 1, &buf[i], 1, E2PROM_Timeout);
madd++;
HAL_Delay(2);
}
}
void I2C_Tel()
{
uint8_t buf[100];
if(Layer == 0)
{
e2prom_write(0,Layer_Buf[0],15);
memset(buf,0,100);
e2prom_read(0,buf,15);
printf("%s",buf);
}
if(Layer == 1)
{
e2prom_write(64,Layer_Buf[1],14);
memset(buf,0,20);
e2prom_read(64,buf,14);
printf("%s",buf);
}
if(Layer == 2)
{
e2prom_write(128,Layer_Buf[2],13);
memset(buf,0,20);
e2prom_read(128,buf,13);
printf("%s",buf);
}
if(Layer == 3)
{
e2prom_write(192,Layer_Buf[3],15);
memset(buf,0,20);
e2prom_read(192,buf,15);
printf("%s",buf);
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
Layer ++;
if(Layer > 3)
Layer = 0;
I2C_Tel();
}
if(GPIO_Pin == GPIO_PIN_13)
{
Layer --;
if(Layer < 0)
Layer = 3;
I2C_Tel();
}
}