📄 lm92.lst
字号:
121 1 SM_BUSY = 1; // SMBus busy flag set.
122 1 SMB0CN = 0x44; // SMBus enabled, ACK low.
123 1 COMMAND = (chip_select | WRITE); // COMMAND = 7 address bits + WRITE.
124 1 STO = 0;
125 1 STA = 1; // Start transfer.
126 1 while(SM_BUSY);
127 1 }
*** WARNING C280 IN LINE 114 OF LM92.C: 'wr_data': unreferenced local variable
128 // 读从器件的程序
129 // chip_select = 从读地址
130 // out_op = 读出的数据字节
131 //number=读出数据的长度
132 char SLA_READ(char chip_select, char out_op,char number) //从LM92读出数据到主机的函数
133 {
134 1 totalnumber=number;
135 1 rdnumber=number;
136 1 SENDMODE=0;
137 1 while(SM_BUSY); // 总线SMBus忙碌则等待
138 1 SM_BUSY = 1; // 设置忙碌位
139 1 SMB0CN = 0x44; // 允许SMBus工作, 应答信号为低
140 1 COMMAND1 = (chip_select | READ); // COMMAND1 = 7位地址+ 1个读位
141 1 COMMAND = (chip_select | WRITE); // COMMAND = 7位地址+ 1个写位
142 1 wr_data[0]=out_op;
143 1 STO = 0;
144 1 STA = 1; // 数据传输开始
145 1 while(SM_BUSY); // 等待数据传输完成
146 1 return WORD; // 返回
147 1 }
148 // SMBus Interrupt Service Routine SMBus中断程序
149 void SMBUS_ISR (void) interrupt 7
150 {
151 1 switch (SMB0STA){ // SMBus中断状态 SMB0STA register)
152 2 //SMB_START ; (SMB0STA =08H)
153 2 //主发送器/接收器发送起始位成功.再将从机写地址送SMB0DAT并清除START位.
154 2 case SMB_START: //0x08
155 2 SMB0DAT = COMMAND ;
156 2 STA = 0; // 人工清除STA
157 2 SI = 0; // 人工清除SI
158 2 break;
159 2 //SMB_RP_START ;(SMB0STA =10H)
160 2 //主发送器/接收器发送重复起始位成功.再将从机读地址送SMB0DAT并清除START位.
161 2 case SMB_RP_START: //0x10
162 2 SMB0DAT = COMMAND1;
163 2 STA = 0; // 人工清除STA
164 2 SI = 0;
165 2 break;
166 2 //SMB_MTADDACK (SMB0STA =18H)
167 2 //主发送器(MT)发送从地址+W成功;收到 ACK(从机应答),再将要发的子地址送入SMB0DAT.
168 2 case SMB_MTADDACK: //0x18
169 2 SMB0DAT = wr_data[0];
170 2 SI = 0; // Clear interrupt flag
171 2 break;
172 2 //SMB_MTDBACK SMB0STA =28H)
173 2 //主发送器(MT)发送数据字节成功;收到ACK(从机应答)
174 2 //检查BYTE_SENT:如果为1,说明刚发出的是存储器地址;为0,刚发出的是数据字节
175 2 case SMB_MTDBACK: //0x28
176 2 switch (SENDMODE){ // Check only lower 4 bits.
177 3 // OP_CODE is a READ. Send repeated START.
178 3 case 1:
C51 COMPILER V7.05 LM92 02/14/2006 09:16:42 PAGE 4
179 3 wrnumber--;
180 3 if(wrnumber)
181 3 SMB0DAT = wr_data[totalnumber-wrnumber];
182 3 else{
183 4 STO=1;
184 4 SM_BUSY=0; }
185 3 break;
186 3 case 0:
187 3 STO = 0;
188 3 STA = 1;
189 3 break;
190 3 default: // 遇到无效的中断状态码,结束传输
191 3 STO = 1;
192 3 SM_BUSY = 0;
193 3 break;
194 3 }
195 2 SI = 0;
196 2 break;
197 2 //SMB_MRADDACK ;(SMB0STA =40H)
198 2 //(MR)主收发器发送从地址+R成功;收到 ACK(从机应答).主机发送ACK.
199 2 // Master Receiver: Slave address + READ transmitted. ACK received.
200 2 // Set to transmit NACK after next transfer since it will be the
201 2 // last (only) byte.
202 2 case SMB_MRADDACK: //0x40
203 2 if(rdnumber==1){
204 3 AA = 0;
205 3 }
206 2 SI = 0;
207 2 break;
208 2 //SMB_MRDBACK (SMB0STA =50H)
209 2 //(MR)主收发器接收数据成功;主机发送ACK .
210 2
211 2 case SMB_MRDBACK: //0x50
212 2 rd_data[totalnumber-rdnumber] = SMB0DAT;
213 2 rdnumber--;
214 2 AA = 0;
215 2 SM_BUSY = 0;
216 2 SI = 0;
217 2 break;
218 2 //SMB_MRDBNACK ;(SMB0STA =58H)
219 2 //(MR)主收发器接收数据成功;主机发送NACK
220 2 //读操作完成。读数据寄存器并发送STOP
221 2 case SMB_MRDBNACK: //0x58
222 2 rd_data[totalnumber-1] = SMB0DAT;
223 2 STO = 1;
224 2 SM_BUSY = 0;
225 2 AA = 1; // Set AA for next transfer
226 2 SI = 0;
227 2 break;
228 2 default:
229 2 STO = 1;
230 2 SM_BUSY = 0;
231 2 break;
232 2 };
233 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 695 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = 1 ----
PDATA SIZE = ---- ----
C51 COMPILER V7.05 LM92 02/14/2006 09:16:42 PAGE 5
DATA SIZE = 22 24
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -