289 lines
14 KiB
Plaintext
289 lines
14 KiB
Plaintext
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 1
|
||
|
||
|
||
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE I2C
|
||
OBJECT MODULE PLACED IN .\Objects\I2C.obj
|
||
COMPILER INVOKED BY: d:\Keil_v5\C51\BIN\C51.EXE mycode\I2C.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\myinc) DEBUG OBJECTEXTEND
|
||
- PRINT(.\Listings\I2C.lst) TABS(2) OBJECT(.\Objects\I2C.obj)
|
||
|
||
line level source
|
||
|
||
1 /*---------------------------------------------------------------------*/
|
||
2 /* --- STC MCU Limited ------------------------------------------------*/
|
||
3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/
|
||
4 /* --- Mobile: (86)13922805190 ----------------------------------------*/
|
||
5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
|
||
6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
|
||
7 /* --- Web: www.STCMCU.com --------------------------------------------*/
|
||
8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/
|
||
9 /* --- QQ: 800003751 -------------------------------------------------*/
|
||
10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
|
||
11 /*---------------------------------------------------------------------*/
|
||
12
|
||
13 #include "I2C.h"
|
||
14
|
||
15 u8 I2C_BUF_type I2C_RxBuffer[I2C_BUF_LENTH];
|
||
16
|
||
17 #define SLAW 0xA2
|
||
18 #define SLAR 0xA3
|
||
19
|
||
20 //========================================================================
|
||
21 // 函数: void I2C_Init(I2C_InitTypeDef *I2Cx)
|
||
22 // 描述: I2C初始化程序.
|
||
23 // 参数: I2Cx: 结构参数,请参考I2C.h里的定义.
|
||
24 // 返回: none.
|
||
25 // 版本: V1.0, 2012-11-22
|
||
26 //========================================================================
|
||
27 void I2C_Init(I2C_InitTypeDef *I2Cx)
|
||
28 {
|
||
29 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
|
||
30 1
|
||
31 1 if(I2Cx->I2C_Mode == I2C_Mode_Master)
|
||
32 1 {
|
||
33 2 I2C_Master(); //设为主机
|
||
34 2 I2CMSST = 0x00; //清除I2C主机状态寄存器
|
||
35 2 I2C_Master_Inturrupt(I2Cx->I2C_MS_Interrupt);
|
||
36 2 I2C_SetSpeed(I2Cx->I2C_Speed);
|
||
37 2 if(I2Cx->I2C_MS_WDTA == ENABLE) I2C_WDTA_EN(); //使能自动发送
|
||
38 2 else I2C_WDTA_DIS(); //禁止自动发送
|
||
39 2 }
|
||
40 1 else
|
||
41 1 {
|
||
42 2 I2C_Slave(); //设为从机
|
||
43 2 I2CSLST = 0x00; //清除I2C从机状态寄存器
|
||
44 2 if(I2Cx->I2C_SL_ESTAI == ENABLE) I2C_ESTAI_EN(); //使能从机接收START信号中断
|
||
45 2 else I2C_ESTAI_DIS(); //禁止从机接收START信号中断
|
||
46 2 if(I2Cx->I2C_SL_ERXI == ENABLE) I2C_ERXI_EN(); //使能从机接收1字节数据中断
|
||
47 2 else I2C_ERXI_DIS(); //禁止从机接收1字节数据中断
|
||
48 2 if(I2Cx->I2C_SL_ETXI == ENABLE) I2C_ETXI_EN(); //使能从机发送1字节数据中断
|
||
49 2 else I2C_ETXI_DIS(); //禁止从机发送1字节数据中断
|
||
50 2 if(I2Cx->I2C_SL_ESTOI == ENABLE) I2C_ESTOI_EN(); //使能从机接收STOP信号中断
|
||
51 2 else I2C_ESTOI_DIS(); //禁止从机接收STOP信号中断
|
||
52 2 I2C_Address(I2Cx->I2C_SL_ADR);
|
||
53 2 if(I2Cx->I2C_SL_MA == ENABLE) I2C_MATCH_EN(); //从机地址比较功能,只接受相匹配地址
|
||
54 2 else I2C_MATCH_DIS(); //禁止从机地址比较功能,接受所有设备地址
|
||
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 2
|
||
|
||
55 2 }
|
||
56 1
|
||
57 1 P_SW2 = (P_SW2 & ~(3<<4)) | I2Cx->I2C_IoUse;
|
||
58 1 I2C_Function(I2Cx->I2C_Enable);
|
||
59 1
|
||
60 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
|
||
61 1 }
|
||
62
|
||
63 //========================================================================
|
||
64 // 函数: void Wait (void)
|
||
65 // 描述: 等待主机模式I2C控制器执行完成I2CMSCR.
|
||
66 // 参数: mode: 指定模式, 取值 I2C_Mode_Master 或 I2C_Mode_Slave.
|
||
67 // 返回: none.
|
||
68 // 版本: V1.0, 2012-11-22
|
||
69 //========================================================================
|
||
70 void Wait()
|
||
71 {
|
||
72 1 while (!(I2CMSST & 0x40));
|
||
73 1 I2CMSST &= ~0x40;
|
||
74 1 }
|
||
75
|
||
76 //========================================================================
|
||
77 // 函数: void Start (void)
|
||
78 // 描述: I2C总线起始函数.
|
||
79 // 参数: none.
|
||
80 // 返回: none.
|
||
81 // 版本: V1.0, 2020-09-15
|
||
82 //========================================================================
|
||
83 void Start()
|
||
84 {
|
||
85 1 I2CMSCR = 0x01; //发送START命令
|
||
86 1 Wait();
|
||
87 1 }
|
||
88
|
||
89 //========================================================================
|
||
90 // 函数: void SendData (char dat)
|
||
91 // 描述: I2C发送一个字节数据函数.
|
||
92 // 参数: 发送的数据.
|
||
93 // 返回: none.
|
||
94 // 版本: V1.0, 2020-09-15
|
||
95 //========================================================================
|
||
96 void SendData(char dat)
|
||
97 {
|
||
98 1 I2CTXD = dat; //写数据到数据缓冲区
|
||
99 1 I2CMSCR = 0x02; //发送SEND命令
|
||
100 1 Wait();
|
||
101 1 }
|
||
102
|
||
103 //========================================================================
|
||
104 // 函数: void RecvACK (void)
|
||
105 // 描述: I2C获取ACK函数.
|
||
106 // 参数: none.
|
||
107 // 返回: none.
|
||
108 // 版本: V1.0, 2020-09-15
|
||
109 //========================================================================
|
||
110 void RecvACK()
|
||
111 {
|
||
112 1 I2CMSCR = 0x03; //发送读ACK命令
|
||
113 1 Wait();
|
||
114 1 }
|
||
115
|
||
116 //========================================================================
|
||
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 3
|
||
|
||
117 // 函数: char RecvData (void)
|
||
118 // 描述: I2C读取一个字节数据函数.
|
||
119 // 参数: none.
|
||
120 // 返回: 读取数据.
|
||
121 // 版本: V1.0, 2020-09-15
|
||
122 //========================================================================
|
||
123 char RecvData()
|
||
124 {
|
||
125 1 I2CMSCR = 0x04; //发送RECV命令
|
||
126 1 Wait();
|
||
127 1 return I2CRXD;
|
||
128 1 }
|
||
129
|
||
130 //========================================================================
|
||
131 // 函数: void SendACK (void)
|
||
132 // 描述: I2C发送ACK函数.
|
||
133 // 参数: none.
|
||
134 // 返回: none.
|
||
135 // 版本: V1.0, 2020-09-15
|
||
136 //========================================================================
|
||
137 void SendACK()
|
||
138 {
|
||
139 1 I2CMSST = 0x00; //设置ACK信号
|
||
140 1 I2CMSCR = 0x05; //发送ACK命令
|
||
141 1 Wait();
|
||
142 1 }
|
||
143
|
||
144 //========================================================================
|
||
145 // 函数: void SendNAK (void)
|
||
146 // 描述: I2C发送NAK函数.
|
||
147 // 参数: none.
|
||
148 // 返回: none.
|
||
149 // 版本: V1.0, 2020-09-15
|
||
150 //========================================================================
|
||
151 void SendNAK()
|
||
152 {
|
||
153 1 I2CMSST = 0x01; //设置NAK信号
|
||
154 1 I2CMSCR = 0x05; //发送ACK命令
|
||
155 1 Wait();
|
||
156 1 }
|
||
157
|
||
158 //========================================================================
|
||
159 // 函数: void Stop (void)
|
||
160 // 描述: I2C总线停止函数.
|
||
161 // 参数: none.
|
||
162 // 返回: none.
|
||
163 // 版本: V1.0, 2020-09-15
|
||
164 //========================================================================
|
||
165 void Stop()
|
||
166 {
|
||
167 1 I2CMSCR = 0x06; //发送STOP命令
|
||
168 1 Wait();
|
||
169 1 }
|
||
170
|
||
171 //========================================================================
|
||
172 // 函数: void WriteNbyte(u8 addr, u8 *p, u8 number)
|
||
173 // 描述: I2C写入数据函数.
|
||
174 // 参数: addr: 指定地址, *p写入数据存储位置, number写入数据个数.
|
||
175 // 返回: none.
|
||
176 // 版本: V1.0, 2020-09-15
|
||
177 //========================================================================
|
||
178 void WriteNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */
|
||
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 4
|
||
|
||
179 {
|
||
180 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
|
||
181 1 Start(); //发送起始命令
|
||
182 1 SendData(SLAW); //发送设备地址+写命令
|
||
183 1 RecvACK();
|
||
184 1 SendData(addr); //发送存储地址
|
||
185 1 RecvACK();
|
||
186 1 do
|
||
187 1 {
|
||
188 2 SendData(*p++);
|
||
189 2 RecvACK();
|
||
190 2 }
|
||
191 1 while(--number);
|
||
192 1 Stop(); //发送停止命令
|
||
193 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
|
||
194 1 }
|
||
195
|
||
196 //========================================================================
|
||
197 // 函数: void ReadNbyte(u8 addr, u8 *p, u8 number)
|
||
198 // 描述: I2C读取数据函数.
|
||
199 // 参数: addr: 指定地址, *p读取数据存储位置, number读取数据个数.
|
||
200 // 返回: none.
|
||
201 // 版本: V1.0, 2020-09-15
|
||
202 //========================================================================
|
||
203 void ReadNbyte(u8 addr, u8 *p, u8 number) /* WordAddress,First Data Address,Byte lenth */
|
||
204 {
|
||
205 1 EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
|
||
206 1 Start(); //发送起始命令
|
||
207 1 SendData(SLAW); //发送设备地址+写命令
|
||
208 1 RecvACK();
|
||
209 1 SendData(addr); //发送存储地址
|
||
210 1 RecvACK();
|
||
211 1 Start(); //发送起始命令
|
||
212 1 SendData(SLAR); //发送设备地址+读命令
|
||
213 1 RecvACK();
|
||
214 1 do
|
||
215 1 {
|
||
216 2 *p = RecvData();
|
||
217 2 p++;
|
||
218 2 if(number != 1) SendACK(); //send ACK
|
||
219 2 }
|
||
220 1 while(--number);
|
||
221 1 SendNAK(); //send no ACK
|
||
222 1 Stop(); //发送停止命令
|
||
223 1 EAXRAM(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */
|
||
224 1 }
|
||
225
|
||
226 //========================================================================
|
||
227 // 函数: void I2C_Isr (void) interrupt I2C_VECTOR
|
||
228 // 描述: I2C中断函数.
|
||
229 // 参数: none.
|
||
230 // 返回: none.
|
||
231 // 版本: V1.0, 2020-09-15
|
||
232 //========================================================================
|
||
233 void I2C_Isr() interrupt I2C_VECTOR
|
||
234 {
|
||
235 1 char store;
|
||
236 1
|
||
237 1 store = P_SW2;
|
||
238 1 P_SW2 |= 0x80;
|
||
239 1
|
||
240 1 //Add user code here.
|
||
C51 COMPILER V9.60.0.0 I2C 03/14/2023 09:20:44 PAGE 5
|
||
|
||
241 1
|
||
242 1 P_SW2 = store;
|
||
243 1 }
|
||
244 /**************** I2C初始化函数 *****************/
|
||
245 void I2C_config(void)
|
||
246 {
|
||
247 1 I2C_InitTypeDef I2C_InitStructure;
|
||
248 1 I2C_InitStructure.I2C_Mode = I2C_Mode_Master; //主从选择 I2C_Mode_Master, I2C_Mode_Slave
|
||
249 1 I2C_InitStructure.I2C_Enable = ENABLE; //I2C功能使能, ENABLE, DISABLE
|
||
250 1 I2C_InitStructure.I2C_MS_WDTA = DISABLE; //主机使能自动发送, ENABLE, DISABLE
|
||
251 1 I2C_InitStructure.I2C_MS_Interrupt = DISABLE; //使能主机模式中断, ENABLE, DISABLE
|
||
252 1 I2C_InitStructure.I2C_Speed = 16; //总线速度=Fosc/2/(Speed*2+4), 0~63
|
||
253 1 I2C_InitStructure.I2C_IoUse = I2C_P14_P15; //IO口切换 I2C_P14_P15, I2C_P24_P25, I2C_P33_P32
|
||
254 1
|
||
255 1 I2C_Init(&I2C_InitStructure);
|
||
256 1 }
|
||
|
||
|
||
MODULE INFORMATION: STATIC OVERLAYABLE
|
||
CODE SIZE = 516 ----
|
||
CONSTANT SIZE = ---- ----
|
||
XDATA SIZE = 128 ----
|
||
PDATA SIZE = ---- ----
|
||
DATA SIZE = ---- 22
|
||
IDATA SIZE = ---- ----
|
||
BIT SIZE = ---- ----
|
||
END OF MODULE INFORMATION.
|
||
|
||
|
||
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|