📄 smbus.lst
字号:
C51 COMPILER V7.50 SMBUS 03/17/2007 10:53:09 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SMBUS
OBJECT MODULE PLACED IN SMBUS.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SMBUS.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***************************************Copyright (c)*************************************
2 **
3 /*--------------文件信息------------------------------------------------------------------
4 **文 件 名:SMBUS.C
5 **创 建 人:王胜
6 **日 期:2007年2月4日
7 **描 述:
8 ** 本库函数可实现I2C总线一次读/写多个字节操作,将这两个文件复制到您的工程目录下,在
9 ** 主函数中使用头文件包含语句 #include "SMBUS.h" 即可,其中包含三个函数:
10 **
11 ** SMBUS初始化函数:
12 ** void SMBus_Init(void);
13 **
14 ** 多个字节数据的发送函数:
15 ** void SMBUS_Puts(
16 ** unsigned char chip,
17 ** unsigned char wordadr,
18 ** char *dat,
19 ** unsigned char number
20 ** );
21 **
22 ** 多个字节数据的读取函数:
23 ** void SMBUS_Gets(
24 ** unsigned char chip,
25 ** unsigned char wordadr,
26 ** char *dat,
27 ** unsigned char number
28 ** );
29 **
30 ** 输入变量定义如下:
31 ** chip : 为I2C器件从地址,本实验板3个I2C器件(ZLG7290,24C02,PCF8563)的从地址定义
-
32 ** (不包括R/W的控制)在头文件"SMBUS.h"中有定义。
33 ** wordadr : 为I2C器件内部寄存器从器件子地址。
34 ** dat : 为读/写数据指针,当为读取时,通过指针直接修改变量的值。
35 ** number : 为每次读/写数据的字节数。
36 *******************************************************************************************/
37
38 #include <c8051f020.h>
39
40 //与SMBUS操作有关变量定义
41 bit SM_BUSY; //SMB0忙标志位.
42 unsigned char SMBMODE; //SMB0读写控制字CHIP_SELECT+R/W.
43 unsigned char SMB_num; //SMB0一次读写的字节数..
44 unsigned char start_adr; //SMB0读写字节在器件中的起始地址.
45 char *SMB_Dat; //SMBUS中断传输数据指针
46
47 /******************************************************************************************/
48 /*函数名称:SMBus_Init() */
49 /*函数功能:SMBus初始化函数 */
50 /*输入参数:无 */
51 /*输出参数:无 */
52 /******************************************************************************************/
53 void SMBus_Init(void)
54 {
C51 COMPILER V7.50 SMBUS 03/17/2007 10:53:09 PAGE 2
55 1 SMB0CN = 0x44; //允许SMBUS, 应答返回AA(低电平有效)
56 1 SMB0CR = 0x00; //配置传送速度为42Kbit/s
57 1 EIE1 |= 0x02; //使能SMBUS中断
58 1 EIP1 |= 0x02; //设置SMBUS中断为高优先级
59 1 }
60
61 /******************************************************************************************/
62 /*函数名称:SMBUS_Puts() */
63 /*函数功能:SMBUS 总线综合发送函数,向从机发送number个字节的数据 */
64 /*入口参数:chip 从机地址(7位纯地址,不含读写位)
65 wordadr 从机的子地址
66 data 待发送的数据指针
67 number 发送数据的字节数 */
-
68 /*出口参数:无 */
69 /******************************************************************************************/
70
71 void SMBUS_Puts(unsigned char chip,unsigned char wordadr,char *dat,unsigned char number)
72 {
73 1 SI = 0;
74 1 SMB_num=number; // 确定写数据大小
75 1 while (SM_BUSY); // 若SMBUS忙碌就等待
76 1 SM_BUSY = 1; // SM_BUSY是忙碌标志位
77 1 SMBMODE=chip & 0xfe;
78 1 start_adr=wordadr; // 装载写字节起始地址
79 1 SMB_Dat= dat;
80 1 STO = 0;
81 1 STA = 1;
82 1 while (SM_BUSY);
83 1 }
84
85 /******************************************************************************************/
86 /*函数名称:SMBUS_Gets() */
87 /*函数功能:SMBUS 总线综合接收函数,从从机接收number个字节的数据 */
88 /*入口参数:chip 从机地址(7位纯地址,不含读写位)
89 wordadr 从机的子地址
90 *data 保存接收到的数据
91 number 读取数据的字节数 */
-
92 /*出口参数:无 */
93 /******************************************************************************************/
94
95 void SMBUS_Gets(unsigned char chip,unsigned char wordadr,char *dat,unsigned char number)
96 {
97 1 SI = 0;
98 1 SMB_num = number; //确定写数据大小
99 1 while (SM_BUSY); // 若SMBUS忙碌就等待
100 1 SM_BUSY = 1; // SM_BUSY是忙碌标志位
101 1 SMBMODE = chip | 0x01;
102 1 start_adr = wordadr; //装载写字节起始地址
103 1 SMB_Dat =dat;
104 1 STO = 0;
105 1 STA = 1;
106 1 while (SM_BUSY);
107 1 }
108
109 //SMBUS中断服务函数
110 void SMBUS_ISR (void) interrupt 7
111 {
112 1 switch (SMB0STA)
113 1 {
114 2 case 0x08: //(MT & MR) 发送起始位
C51 COMPILER V7.50 SMBUS 03/17/2007 10:53:09 PAGE 3
115 2 SMB0DAT = (SMBMODE & 0xFE); //发送从器件地址 + W
116 2 STA = 0;
117 2 break;
118 2 case 0x10: //(MT & MR) 重复起始位
119 2 SMB0DAT = (SMBMODE | 0x01); // 发送从器件地址 + R.
120 2 STA = 0;
121 2 break;
122 2 case 0x18: //(MT) 发送从地址 + W 后收到ACK
123 2 SMB0DAT = start_adr; // 发送SMB0读写字节在器件中的起始地址.
124 2 break;
125 2 case 0x20: //(MT) 发送从地址 + W 后收到NACK
126 2 STO = 1;
127 2 STA = 1;
128 2 break;
129 2 case 0x28: //(MT) 发送数据后收到ACK
130 2 if(SMB_num)
131 2 {
132 3 if (SMBMODE & 0x01) // 如果为读操作则重新启动总线.
133 3 {
134 4 STO = 0;
135 4 STA = 1;
136 4 }
137 3 else
138 3 {
139 4 SMB0DAT = *SMB_Dat; //如果为写操作则将数据写入SMB0DAT.
140 4 SMB_Dat++;
141 4 SMB_num--;
142 4 }
143 3 }
144 2 else //如果数据写入完毕则发送停止信号.
145 2 {
146 3 STO = 1;
147 3 SM_BUSY = 0;
148 3 }
149 2 break;
150 2 case 0x30: //(MT) 发送数据后收到NACK
151 2 STO = 1;
152 2 STA = 1;
153 2 break;
154 2 case 0x38 : //(MT)竞争失败
155 2 STO = 1;
156 2 STA = 1;
157 2 break;
158 2 case 0x40: //(MR) 发送从地址 + R 后收到 ACK
159 2 if(SMB_num==1) //如果只读一个字节则将应答位AA清0,
160 2 AA = 0; //收到数据以后不发送应答位
161 2 else
162 2 AA = 1; //如果读字节数大于1则收到数据以后发送应答位
163 2 break;
164 2 case 0x48: //(MR) 发送从地址 + R 后收到 NACK
165 2 STO = 0;
166 2 STA = 1;
167 2 break;
168 2 case 0x50: //(MR) 收到数据字节 后已发送ACK
169 2 if(SMB_num>2)
170 2 {
171 3 *SMB_Dat = SMB0DAT;
172 3 SMB_Dat++;
173 3 SMB_num--;
174 3 AA=1;
175 3 }
176 2 else if(SMB_num ==2)
C51 COMPILER V7.50 SMBUS 03/17/2007 10:53:09 PAGE 4
177 2 {
178 3 *SMB_Dat = SMB0DAT;
179 3 SMB_Dat++;
180 3 SMB_num--;
181 3 AA=0;
182 3 }
183 2 break;
184 2 case 0x58: //(MR) 收到数据字节 后已发送NACK
185 2 *SMB_Dat = SMB0DAT;
186 2 STO = 1;
187 2 SM_BUSY = 0;
188 2 break;
189 2 default:
190 2 STO = 1;
191 2 SM_BUSY = 0;
192 2 break;
193 2 }
194 1 SI=0; // 清除中断标志
195 1 }
196
197
198
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 332 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 12
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -