sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040
調試好的can(匯編及C語言)程序,與大家分享!
//************************************程序功能***************************************************
//節點1向CAN節點2發送數據,數據的頭兩個字節分別是:節點1的ID和要求節點2回復的數據長度
//節點2收到節點1的信息后,立即按照節點1的要求回復數據
//************************************************************************************************
#include
#include ???????????????????????????//SJA存儲器定義頭文件
#include ???????????????????????????//SJA子程序文件
#include ??????????????????????????????//顯示頭文件
#include?????????//字符串函數
//***************************頭文件***************************************************//
void Init_Cpu(void);????????????????????????????????//初始化單片機
void Sja_1000_Init(void);???????????????????????????//初始化SIA
//************************************************************************************
bit s;??????????????????????????????????????????????//配置sja標志
bit flag_send;??????????????????????????????????????//發送命令標志
unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05}; //顯示"5"
unsigned char b[5]={0x12,0x12,0x12,0x12,0x12};??????//顯示"p"
unsigned char c[5]={0x01,0x01,0x01,0x01,0x01};??????//顯示"1"
unsigned char data??send_data[10],rcv_data[10];?????//發送和接收數組
unsigned char bdata flag_init;??????????????????????//保存中斷寄存器值
unsigned int count_k;???????????????????????????????//延時記數用
sbit rcv_flag=flag_init^0;??????????????????????????//接收中斷標志
sbit err_flag=flag_init^2;??????????????????????????//錯誤中斷標志
//***********************************************************************************//
void main(void)
{
s=0;????????????????????????????????????????????//配置sja1000出現錯誤時,重新初始化
do{
Sja_1000_Init();
}while(s!=0);
Init_Cpu();????????????????????????????????????????//initialize mcu
flag_init=0x00;?????????????????????????????????//保存中斷寄存器值清零
while(1)
{
if(rcv_flag)????????????????????????????????//if there is receive interrupt
{
rcv_flag=0;?????????????????????????????//接收標志位清零
BCAN_DATA_RECEIVE(rcv_data);????????????//接收數據
BCAN_CMD_PRG(RRB_CMD);??????????????????//釋放接收緩沖區
flag_send=1;????????????????????????????//發送命令置位
}
if(flag_send)
{
flag_send=0;????????????????????????????//發送位清零
send_data[0]=rcv_data[2];????????????????//接收到的"發送方ID10~ID3"
send_data[1]=rcv_data[3];???????????????//接收到的"發送方ID2~ID0"和要求的數據長度
send_data[2]=0x88;
send_data[3]=0x89;
BCAN_DATA_WRITE(send_data);?????????????//發送數據
BCAN_CMD_PRG(TR_CMD);???????????????????//置位發送請求位
for(count_k=0;count_k<200;count_k++)
display(a);?????????????????????????????//延時顯示"5"
}
if (err_flag)???????????????????????????????//錯誤中斷
{
for(count_k=0;count_k<280;count_k++)
display(c);?????????????????????????????//錯誤顯示"1"
err_flag=0;?????????????????????????????//錯誤標志位清零
Sja_1000_Init();????????????????????????//初始化SJA
}
display(b);?????????????????????????????????//顯示"p"
}
}
void ex0_int(void) interrupt 0 using 1??????????????//外部中斷0
{
SJA_BCANAdr=REG_INTERRUPT;??????????????????????//指針指向中斷寄存器
flag_init=*SJA_BCANAdr;?????????????????????????//保持中斷寄存器值
}
void Init_Cpu(void)?????????????????????????????????//單片機初始化,開放外部中斷0
{
PX0=1;
EX0=1;
EA=1;
}
void Sja_1000_Init(void)
{
s=BCAN_CREATE_COMMUNATION();??//SJA自測
s=BCAN_ENTER_RETMODEL();??????//進入復位
s=BCAN_SET_BANDRATE(0x04);????//設置波特率100K/S
s=BCAN_SET_OBJECT(0xaa,0x00); //設置地址ID:550
s=BCAN_SET_OUTCLK(0xaa,0x48); //設置輸出方式,禁止COLOCKOUT輸出
s=BCAN_QUIT_RETMODEL();???????//退出復位模式
SJA_BCANAdr=REG_CONTROL;??????//地址指針指向控制寄存器
*SJA_BCANAdr|=0x1e;???????????//開放錯誤\接收\發送中斷
}
******************以下為匯編程序*********************************************************************
系統can地址為550,用于can系統測試,應用T0定時器每隔1s向can總線發送一組數據:數據長度為8個字節,
首字節為05H,第二個字節為累加變量,每秒鐘數值增加1,
*********************************************************************************************************
CONTROLLER_BASE???EQU???7E00H?????;SJA1000的片選地址
RCV_GOOD????????BIT????0FH????;成功的接收一幀標志
SEC_FLAG????????BIT????010H????;一秒到標志
ERR_FLAG????????BIT????011H????;監測到錯誤標志
SAVE_INT_INFO???DATA????032H????;保存SJA1000中斷寄存器的內容
SEND_DATA_BUF1????DATA?????040H????;發送緩沖區
SEND_DATA_BUF2????DATA????041H
SEND_DATA_BUF3????DATA????042H
SEND_DATA_BUF4????DATA????043H
SEND_DATA_BUF5????DATA????044H
SEND_DATA_BUF6????DATA????045H
SEND_DATA_BUF7????DATA????046H
SEND_DATA_BUF8????DATA????047H
SEND_DATA_BUF9????DATA????048H
SEND_DATA_BUF10???DATA????049H
RCV_DATA_BUF1?????DATA????050H????;接收緩沖區
RCV_DATA_BUF2?????DATA????051H
RCV_DATA_BUF3?????DATA????052H
RCV_DATA_BUF4?????DATA????053H
RCV_DATA_BUF5?????DATA????054H
RCV_DATA_BUF6?????DATA????055H
RCV_DATA_BUF7?????DATA????056H
RCV_DATA_BUF8?????DATA????057H
RCV_DATA_BUF9?????DATA????058H
RCV_DATA_BUF10????DATA????059H
ERROR_STATUS??????DATA??07CH????;錯誤狀態表示
TEST_DATA?????????DATA????07FH????;測試發送數據
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序開始
ORG?????????0000H
LJMP????????MAIN?????????;運行主程序
ORG????????0003H
LJMP????????BCAN_INT0????;中斷方式訪問SJA1000程序
ORG????????000BH
LJMP????????T0_INTERRUPT?????;定時器0中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG???????????????0100H???;程序開始
MAIN:
MOV????????R0,#07fH
CLR?????A
MOV?????@R0,A
DJNZ????R0,$-1
MOV?????@R0,A
MOV?????SP,#60H????????;設置SP
CLR?????P2.0????????????????;SJA1000退出硬件復位模式
LCALL???SJA1000_INT0????;初始化SJA1000
LCALL???T0_INIT
CLR?????P3.4????????????????;點亮指示燈
SETB????PX0
SETB????IT0
SETB????EX0
SETB????ET0
SETB????TR0
SETB????EA
LOOPER:
JNB????????RCV_GOOD,LOOPER2????;sja1000成功接收一幀,通知CPU處理
CLR?????????RCV_GOOD
LCALL???????RCVDATA_PRG
LOOPER2:
JNB????????SEC_FLAG,LOOPER3????;一秒時間到,每秒發送一次
CLR?????????SEC_FLAG
CLR?????????P3.5????????????????;點亮指示燈
LCALL???????SENDDATA_PRG
LOOPER3:
JNB????????ERR_FLAG,LOOPER4???????????????;錯誤標志,錯誤處理
CLR?????????ERR_FLAG
LCALL???????ERR_PRG
LOOPER4:
AJMP????????LOOPER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化SJA1000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SJA1000_INT0:
LCALL?????????BCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數
MOV???????????R7,???????????#04
LCALL?????????BCAN_SET_BANDRATE???;設置波特率為100k
MOV???????????R7,?????????#0A8H??;設置接收報文ID
MOV???????????R6,?????????#0FFH
LCALL?????????BCAN_SET_OBJECT
MOV???????????R7,?????????#0AAH???;設置輸出控制、時鐘分頻;正常輸出模式
MOV???????????R6,?????????#048H???;使能內部比較器、禁止CLKOUT
LCALL?????????BCAN_SET_OUTCLK?????;
LCALL?????????BCAN_QUIT_RETMODEL??;退出復位狀態
MOV??????????????DPTR,#REG_CONTROL???;開放SJA1000內部功能中斷
MOV??????????????A,#01EH??????????;中斷開放
MOVX??????@DPTR,A
CLR???????????F0
RET
;;;;;;;;;;;;;;;;;;;;;;錯誤信息處理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ERR_PRG:
LCALL?????BCAN_ENTER_RETMODEL?????????????????;進入復位模式
LCALL???????SJA1000_INT0 ;
MOV???????ERROR_STATUS,#0FCH
RET
;;;;;;;;;;;;;;;;;;;;;;;接收數據處理部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RCVDATA_PRG:
MOV????R0,# RCV_DATA_BUF1?????;微處理器接收首地址
LCALL????BCAN_DATA_RECEIVE??????????????;調用接收數據子程序
MOV????R7,#04H??????????????????;釋放接收緩沖區
LCALL????BCAN_CMD_PRG????????;
RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發送數據處理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOV???????????R0,??????????#SEND_DATA_BUF1
MOV???????????@R0,?????????#02H
INC???????????R0
MOV???????????@R0,?????????#08H
INC???????????R0
MOV???????????@R0,?????????#05H
MOV??????????????A,???????????TEST_DATA
INC???????????R0
MOV???????????@R0,?????????A
MOV???????????R0,??????????#SEND_DATA_BUF1
LCALL?????????BCAN_DATA_WRITE???????;將要發送的數據送入發送緩沖區
MOV???????????R7,??????????#01
LCALL?????????BCAN_CMD_PRG
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
T0_INIT:
MOV?????A,TMOD
ANL?????A,#0F0H
ORL?????A,#01H
MOV????????TMOD,A;T0工作在方式1
MOV????????TH0,#0FCH????????;定時周期1MS
MOV????????TL0,#066H
MOV?????3AH,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中斷0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCAN_INT0:
push????DPH
PUSH????DPL
PUSH????PSW????????????;PSW,ACC入棧
PUSH????ACC
USING????3????????????;應用寄存器第3組
MOV????DPTR,#REG_INTERRUPT????;讀中斷寄存器
MOVX????A,@DPTR??????????;
MOV????SAVE_INT_INFO,A????????;保存中斷寄存器的內容
JNB?????ACC.0,BCAN_INT1????????;接收中斷
SETB????RCV_GOOD????????;置位接收標志
BCAN_INT1:
MOV????A,SAVE_INT_INFO
JNB????ACC.2,BCAN_INT2????????;錯誤中斷
SETB????ERR_FLAG????????;置位錯誤標志
BCAN_INT2:
POP????ACC
POP????PSW
POP?????DPL
POP?????DPH
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0中斷;;;;;;;;;;;;;;;;
T0_INTERRUPT:
push????DPH
PUSH????DPL
PUSH????PSW?????????????;PSW、ACC入棧
PUSH????ACC
USING???2
MOV????TH0,#80H?????????;設置定時周期0.3S
MOV????TL0,#26H
INC?????3AH
MOV?????A,3AH
CJNE????A,#23H,T0_QUIT???????;判斷1秒時間是否到
MOV?????3AH,#00H
INC????TEST_DATA????????????;測試發送的數據,每1秒加1
SETB????SEC_FLAG?????????????;置位1秒到標志
T0_QUIT:
POP????ACC
POP????PSW
POP?????DPL
POP?????DPH
RETI
*********************************************************************
本人同時提供can實驗開發板給初學者
1???CAN控制器為SJA1000,驅動器為TJA1050,電源隔離;
2???提供詳盡的源程序,可根據用戶需求編寫程序
聯系我:13671387011(短信聯系,QQ詳談)
QQ: 531706356
總結
以上是生活随笔為你收集整理的sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLSQL基本操作手册
- 下一篇: android java 指针异常处理,