?? 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 = 讀出的數(shù)據字節(jié)
131 //number=讀出數(shù)據的長度
132 char SLA_READ(char chip_select, char out_op,char number) //從LM92讀出數(shù)據到主機的函數(shù)
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; // 數(shù)據傳輸開始
145 1 while(SM_BUSY); // 等待數(shù)據傳輸完成
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中斷狀態(tài) SMB0STA register)
152 2 //SMB_START ; (SMB0STA =08H)
153 2 //主發(fā)送器/接收器發(fā)送起始位成功.再將從機寫地址送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 //主發(fā)送器/接收器發(fā)送重復起始位成功.再將從機讀地址送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 //主發(fā)送器(MT)發(fā)送從地址+W成功;收到 ACK(從機應答),再將要發(fā)的子地址送入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 //主發(fā)送器(MT)發(fā)送數(shù)據字節(jié)成功;收到ACK(從機應答)
174 2 //檢查BYTE_SENT:如果為1,說明剛發(fā)出的是存儲器地址;為0,剛發(fā)出的是數(shù)據字節(jié)
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: // 遇到無效的中斷狀態(tài)碼,結束傳輸
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)主收發(fā)器發(fā)送從地址+R成功;收到 ACK(從機應答).主機發(fā)送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)主收發(fā)器接收數(shù)據成功;主機發(fā)送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)主收發(fā)器接收數(shù)據成功;主機發(fā)送NACK
220 2 //讀操作完成。讀數(shù)據寄存器并發(fā)送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 + -