📄 i2c.lst
字号:
1: #include <pic.h>
2: #include "total.h"
3:
4: /******************************************************************************************
5: * 函数名称: void Check_Idle(void)
6: * 功能: 检测总线是否处于空闲状态
7: * 入口参数: 无
8: * 出口参数: 无
9: * 全局变量: 无
10: * 调用模块: 无
11: * 设计者: 饶阳胜
12: * 日期: 05/3/1
13: ******************************************************************************************/
14: void CheckIdle(void)
15: {
16: while(STAT_RW != 0); //总线正在向外发送数据
17: while((SSPCON2 & 0x1F)!= 0);
18: }
19:
20: /*****************************************************************************************
21: * 函数名称: void WrtAckTest(void)
22: * 功能: 检测器件的应答信号
23: * 入口参数: 无
24: * 出口参数: 无
25: * 全局变量: 无
26: * 调用模块: 无
27: * 设计者: 饶阳胜
28: * 日期: 05-3-1
29: *****************************************************************************************/
30: void WrtAckTest(void)
31: {
32: SSPIF = 0;
33: while(SSPIF == 0); //等待总线应答信号
34: }
35:
36: /******************************************************************************************
37: * 函数名称: void I2C_Write_Byte(unsigned char Devive_Address,unsigned char address,unsigned char data)
38: * 功能: 向EEPROM中写入一个字节的数据
39: * 入口参数: address,(要写入EEPROM的地址) data(要写入的数据) Device_Address 器件地址
40: * 出口参数: 无
41: * 全局变量:
42: * 调用模块:
43: * 设计者: 饶阳胜
44: * 日期: 05-3-1
45: ******************************************************************************************/
46: void I2C_Write_Byte(unsigned char Device_Address,unsigned char Address,unsigned char Data)
47: {
48: CheckIdle(); //查询总线状态,是否空闲
49: SEN = 1; //向总线发出起始信号
50: while(SSPIF == 0); //等待总线的应答信号
51: SSPBUF = Device_Address; //向总线发出器件地址
52: WrtAckTest(); //查询应答信号
53: while(STAT_BF == 1);
54: SSPBUF = Address; //向总线发出要写入的数据存放地址
55: WrtAckTest(); //查询应答信号
56: while(STAT_BF == 1);
57: SSPBUF = Data; //向总线写入数据
58: WrtAckTest(); //查询应答信号
59: SSPIF = 0;
60: PEN = 1; //向总线发出停止信号
61: while(SSPIF == 0);
62: SSPIF = 0; //清除总线中断标志
63: Delay(16,250); //延时,让写操作完成
64: }
65:
66: /*******************************************************************************************
67: * 函数名称: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
68: * 功能: 从EEPROM中读出一个字节的数据
69: * 入口参数: Device_Address(器件地址),Address(数据在EEPROM中的存放地址)
70: * 出口参数: Data( 读出的数据)
71: * 全局变量:
72: * 调用模块:
73: * 设计者: 饶阳胜
74: * 日期: 05-3-2
75: ********************************************************************************************/
76: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
77: {
78: unsigned char Recieve;
79:
80: CheckIdle();
81: SSPIF = 0;
82: SEN = 1;
83: while(SSPIF == 0);
84: SSPBUF = Device_Address; //向总线发送器件地址
85: WrtAckTest(); //等待总线的应答信号
86: SSPBUF = Address; //向总线发出数据在EEPROM中的存储地址
87: WrtAckTest(); //等待总线的应答信号
88: Delay(16,250);
89: CheckIdle(); //等待总线处于空闲状态
90: SSPIF = 0; //清除总线的中断标志
91: RSEN = 1; //发出重启动信号
92: while(SSPIF == 0); //等待总线中断信号,重启动完成
93: SSPBUF = (Device_Address + 1); //发出器件地址(+1)表示读操作
94: WrtAckTest(); //等总线的应答信号
95: SSPIF = 0; //清总线中断标志
96: RCEN = 1; //使能接收
97: SSPIF = 0;
98: while(SSPIF == 0);
99: Recieve = SSPBUF; //存放接收到的数据
100: SSPIF = 0; //清除总线的中断标志
101: ACKDT = 1; //向总线发出应答信号
102: ACKEN = 1;
103: while(SSPIF == 0);
104: PEN = 1;
105: while(SSPIF == 0);
106: SSPIF = 0;
107: return(Recieve);
108: }
109:
110: /******************************************************************************************
111: * 函数名称: unsigned char MyWrite(unsigned char *Data,unsigned char Number,
112: * unsigned char Address)
113: * 功能: 向EEPROM中写入标定数据
114: * 入口参数: *Data(指向要写入EEPROM的数据的指针) Number(要写入的数据个数)
115: * Address(数据在EEPROM中的存放地址)
116: * 出口参数: unsigned char(0: 写入不成功, 1: 写入成功)
117: * 全局变量:
118: * 调用模块: I2C_Write_Byte(向EEPROM中写入一个字节的数据)
119: * 设计者: 饶阳胜
120: * 日期: 05/3/4
121: * 说明: 数据在EEPROM中的存储格式为:以字节的形式
122: * 而数据在RAM中的存储形式为unsigned short(半字形式),所以要进行转换
123: ******************************************************************************************/
124: unsigned char My_Write(bank1 short *data,unsigned char number,unsigned char address)
125: {
126: static bit change; //用于将RAM中以半字形式存储的数据拆成在便于在EEPROM中存储的字节形式
127: unsigned char writedata; //要写入EEPROM中的数据变量
128:
129: change = 0;
130:
131: for(;number > 0; number--){ //向EEPROM中写入数据循环
132: do{
133: if(change == 0){
134: writedata = (unsigned char)(*data & 0xFF); //得到低字节数据
135: change = 1;
136: }else{
137: writedata = (unsigned char)(*data >> 8); //得到高字节数据
138: change = 0;
139: }
140: I2C_Write_Byte(0xA0,address,writedata); //向EEPROM写数据
141: ++address; //数据在EEPROM中的存放地址加1
142: }while(change == 1);
143: ++data; //指向下一个数据
144: }
145: return(1);
146: }
147:
148: /****************************************************************************************
149: * 函数名称: unsigned char MyRead(unsigned short *Data,unsigned char Number,
150: * unsigned char Address)
151: * 功能: 将EEPROM中的数据读出到RAM中
152: * 入口参数: unsigned short *Data(指向读出数据存放到RAM中的地址指针)
153: * unsigned char Number 要读出的数据个数
154: * unsigned char Address 数据在EEPROM中的存放地址
155: * 出口参数: unsigned char(0: 读出不成功,1:读出成功)
156: * 全局变量:
157: * 调用模块: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
158: * 从EEPROM中读出一个字节数据的函数
159: * 设计者: 饶阳胜
160: * 日期: 05/3/5
161: * 说明: 每次从EEPROM中读出的数据是一个字节,而读出的数据在EEPROM中的存储形式是半字形式,所以要进行转换
162: ****************************************************************************************/
163: unsigned char My_Read(bank1 short *data,unsigned char number,unsigned char address)
164: {
165: static bit change; //用于将读出的数据合成一个半字形式
166: unsigned char readdata; //从EEPROM中的读出的数据变量
167:
168: change = 0;
169:
170: for(;number > 0; number--){ //从EEPROM中读出数据的循环
171: do{
172: readdata = I2C_Read_Byte(0xA0,address); //从EEPROM中读取数据
173: ++address; //EEPROM地址加1
174: if(change == 0){
175: *data = readdata; //存储低字节
176: change = 1;
177: }else{
178: *data = (readdata << 8) | (*data & 0xff); //存储高字节
179: change = 0;
180: }
181: }while(change == 1);
182: ++data; //指向一个字节
183: }
184: return(1);
185: }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -