📄 sja1000.lst
字号:
208 unsigned int CAN_Read(unsigned char *Buf,unsigned int MaxNum)
209 {
210 1 unsigned int Count = 0;
211 1
212 1 OFF_CAN_INT();
213 1 while (MaxNum--)
214 1 {
215 2 if (RX_Buff_Tail == RX_Buff_Head)
216 2 {//没有数据了
217 3 break;
218 3 }
219 2 *Buf++ = RX_BUFF[RX_Buff_Tail++];
220 2 if(RX_Buff_Tail == RX_BUFF_LEN )
221 2 RX_Buff_Tail = 0; // 指针循环
222 2 Count++;
223 2 }
224 1
225 1 ON_CAN_INT();
226 1
227 1 return Count;
228 1 }
229 /*
230
231 返回实际读取到的数据
232 */
233
234 unsigned int UART_Read(unsigned char *Buf,unsigned int MaxNum)
235 {
236 1 unsigned int Count = 0;
237 1
238 1 ES = 0;
239 1 while (MaxNum--)
240 1 {
241 2 if (UART_RX_Buff_Tail == UART_RX_Buff_Head)
C51 COMPILER V8.01 SJA1000 04/22/2008 17:46:16 PAGE 5
242 2 {//没有数据了
243 3 break;
244 3 }
245 2 *Buf++ = UART_RX_Buff[UART_RX_Buff_Tail++];
246 2 if(UART_RX_Buff_Tail == UART_RX_Buff_LEN )
247 2 UART_RX_Buff_Tail = 0; // 指针循环
248 2 Count++;
249 2 }
250 1
251 1 ES = 1;
252 1
253 1 return Count;
254 1 }
255 bit UART_Send(unsigned char *DataBuf,unsigned int Num)
256 {
257 1 unsigned int len;
258 1 bit Flag = 0;
259 1 unsigned char i;
260 1
261 1 //计算发送缓冲区的剩余大小
262 1
263 1 do {
264 2 ES = 0;
265 2
266 2 if( UART_TX_Buff_Head < UART_TX_Buff_Tail)
267 2 {
268 3 len = UART_TX_Buff_Tail - UART_TX_Buff_Head;
269 3 }
270 2 else
271 2 {
272 3 len =UART_TX_Buff_LEN - UART_TX_Buff_Head + UART_TX_Buff_Tail;
273 3 }
274 2
275 2 ES = 1;
276 2
277 2 if (len >= Num)
278 2 {//有空间发送多余的数据
279 3 break;
280 3 }
281 2 Delay(100);
282 2 i++;
283 2 } while(i< 200);
284 1 if (i>199)
285 1 {
286 2 return FALSE;
287 2 }
288 1
289 1 //讲数据放到发送缓冲区
290 1
291 1 ES = 0;
292 1 if( UART_TX_Buff_Head == UART_TX_Buff_Tail)
293 1 Flag = 1;
294 1
295 1
296 1 for(len=0; len<Num; len++)
297 1 {
298 2 UART_TX_Buff[UART_TX_Buff_Head++]=DataBuf[len];
299 2
300 2 if(UART_TX_Buff_Head == UART_TX_Buff_LEN )
301 2 UART_TX_Buff_Head = 0; // 指针循环
302 2 }
303 1 ES = 1;
C51 COMPILER V8.01 SJA1000 04/22/2008 17:46:16 PAGE 6
304 1 if (Flag == 1)
305 1 {
306 2 TI = 1;
307 2 }
308 1
309 1 }
310
311 /****************************************************************************
312 发送函数
313 参数:*Buf是某个数组名。这个数组一般是xdata型的。例如a[20],CAN_Send(a,20)。Num是发送数据的个数(小于160)。
314 返回:
315 注:"如果缓冲区可以容纳这么多直接填充,如果缓冲区满的话等待之.发送前把发送中断直接打开"
316
317
318 */
319 bit CAN_Send(unsigned char *DataBuf,unsigned int Num)
320 {
321 1 unsigned char i;
322 1 unsigned int len;
323 1 unsigned char *p;
324 1
325 1
326 1
327 1 //计算发送缓冲区的剩余大小
328 1 i = 0;
329 1 do {
330 2 OFF_CAN_INT(); //关闭CAN中断
331 2
332 2 if( TX_Buff_Head < TX_Buff_Tail)
333 2 {
334 3 len = TX_Buff_Tail - TX_Buff_Head;
335 3
336 3 }
337 2 else
338 2 {
339 3 len =TX_BUFF_LEN - TX_Buff_Head + TX_Buff_Tail;
340 3 }
341 2 ON_CAN_INT();
342 2 if (len >= Num)
343 2 {//有空间发送多余的数据
344 3 break;
345 3 }
346 2 Delay(10);
347 2 i++;
348 2 } while(i< 200);
349 1 if (i>199)
350 1 {
351 2 return FALSE;
352 2 }
353 1 //讲数据放到发送缓冲区
354 1
355 1 OFF_CAN_INT();
356 1
357 1 for(len=0; len<Num; len++)
358 1 {
359 2 TX_BUFF[TX_Buff_Head++]=DataBuf[len];
360 2
361 2 if(TX_Buff_Head == TX_BUFF_LEN )
362 2 TX_Buff_Head = 0; // 指针循环
363 2 }
364 1
365 1 i = REG_SR;
C51 COMPILER V8.01 SJA1000 04/22/2008 17:46:16 PAGE 7
366 1 p = (unsigned char xdata *)(SJA_REG_BaseADD + 0x15);
367 1
368 1 if ((i & 0x04) == 0x04)
369 1 {//发送缓冲区处于释放状态时,可以将部分数据发送出去
370 2 i = 0;
371 2 do {
372 3 p[i] = TX_BUFF[TX_Buff_Tail++];
373 3 i++;
374 3 if(TX_Buff_Tail == TX_BUFF_LEN )
375 3 TX_Buff_Tail = 0; // 指针循环
376 3 } while((i<8) &&(TX_Buff_Head != TX_Buff_Tail));
377 2
378 2 if ((CANConfig.Mode & 0x04) == 0)
379 2 {//标准帧
380 3 REG_RxBuffer0 = i;
381 3 }
382 2 else
383 2 {//扩展帧
384 3 REG_RxBuffer0 = 0x80 + i;
385 3 }
386 2
387 2 REG_CMR = 0x01; //发送命令
388 2 }
389 1
390 1 ON_CAN_INT();
391 1
392 1 return TRUE;
393 1
394 1 }
395
396
397
398
399
400 /*******************************************************************
401 CAN初始化函数
402 参数:Mode:0:设置成basic模式 1:设置成PELICAN模式
403 返回: 初始化成功返回TRUE,否则FALSE
404 注:先调PeliCan,有时间再调BasicCan
405 */
406 bit CAN_Init(void)
407 {
408 1 unsigned char Temp,i;
409 1
410 1 RESET_SJA1000(); //复位芯片
411 1
412 1 //设置之前先进入复位模式
413 1
414 1
415 1
416 1 /*00000001,进入复位模式, MOD | | | |SM|AFM|STM|LOM|RM|
417 1 SM: 睡眠模式 1 睡眠;没有CAN中断等待和总线活动时,CAN控制器进入睡眠模式 0 唤醒;从睡眠状态唤醒
418 1 AFM 验收滤波器模式 1 单;选择单个验收滤波器(32位长度) 0 双;选择两个验收滤波器(每个有16位激活)
419 1 STM 自检测模式 1 自检测; 此模式可以检测所有节点,没有任何活动的节点使用自接收命令;即使没有应答,CAN控制器
-也会成功发送
420 1 0 正常模式;成功发送时必需应答信号
421 1 LOM 只听模式 1只听;这种模式中,即使成功接收信息,CAN控制器也不向总线发应答信号;错误计数器停止在当 0 正常
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -