目录
一.目标
PC 端的串口调试软件通过 RS-485 与单片机通信,控制单片机利用软件模拟 I2C 总线对 EEPROM(24C02) 进行任意读写。
二.硬件简述
2.1 24C02硬件参数
24C02器件地址为0x50,存储容量为256字节,存储单元地址位数为8。地址发送方法如下图所示。
2.2 RS-485简述
在工业控制领域,传输距离越长,要求抗干扰能力也越强。由于 RS-232 无法消除共模干扰,且传输距离只有 15m 左右,无法满足要求。
工业标准组织提出了 RS-485 接口标准。 RS-485 标准采用差分信号传输方式,因此具有很强的抗共模干扰能力。 RS-485 接口芯片 SP485E 的封装及引脚说明如下图 1。
RS-485 的逻辑电平为:
①当 A 的电位比 B 高 200mV 以上时, 为逻辑 1;
②当 B 的电位比 A 电位高200mA 以上时为逻辑 0,传输距离可达 1200m。由于是差分传输,因此无需公共地,在 RS-485 总线上仅需连接两根线 A 和 B。
单片机与 RS-485 接口芯片的电路连接图如下图 2。
三.控制命令定义
定义如下命令:
①c——串口接收数据函数初始化
②s——单片机将接收到的数据发送到串口调试终端显示,以确认单片机是否已正确接收数据
③w——将接收缓冲区 wbuf 中的数据写入 EEPROM 中
④r——将刚才写入 EEPROM 中的数据读出到缓冲区 rbuf 中,并发送到串口调试终端显示
四.C代码
本代码注重功能实现,以期达到理解I2C协议和24C02读写方法的目的。实际项目还须考虑代码质量,如可读性、可维护性等。
4.1 I2C基础时序模拟
4.1.1 引脚初始化
void i2cinit(void)
{
sdaout;/*引脚输出模式*/
sclout;
sda = 1; /*释放总线*/
scl = 1;
}
4.1.2 延时函数
1.SCL 时序控制延时函数
78K0指令的最短时钟周期为2个,一条NOP指令即为2个时钟周期,若使用内部8MHz时钟,则执行一条NOP指令需0.25us。
void delay(void)
{
UCHAR i;
for(i = 0;i < NOP_num;i++)
NOP();
}
2.长延时函数
void delay_long(UINT a)
{
UINT i,j;
for(i = 0;i < a;i++)
for(j = 0;j < 100;j++);
}
4.1.3 起始信号模拟
SCL 线为高电平期间, SDA 线由高电平向低电平的变化表示起始信号。
void i2cstart(void)
{
sdaout;
sclout;
/*1.初始化SDA为高电平:在SCL低电平期间拉高SDA*/
scl = 0;
delay();
sda = 1;
delay();
/*2.模拟一个起始信号*/
scl = 1;
delay();
sda = 0;
delay();
}
4.1.4 停止信号模拟
SCL 线为高电平期间, SDA 线由低电平向高电平的变化表示终止信号。
void i2cstop(void)
{
sdaout;
sclout;
/*1.初始化SDA为低电平:在SCL低电平期间拉低SDA*/
scl=0;
delay();
sda=0;
delay();
/*2.模拟一个停止信号*/
scl=1;
delay();
sda=1;
delay();
}
4.1.5 应答信号模拟
每一个字节必须保证是 8 位长度。数据传送时,先传送最高位(MSB),每一个被传送的
字节后面都必须跟随一位应答位(即一帧共有 9 位)。
&