?? main.c
字號:
#define _GLOBAL_SJA1000_PELI_
#include "PELI.H"
#include "reg52.h"
#include "REG.h"
#include "IO.h"
sbit RST_SJA1000 = P1^6; //SJA1000硬件復位
//#ifdef _GLOBAL_SJA1000_PELI_
//extern unsigned char xdata CAN_SJA_BaseAdr; //定義SJA1000的片選基址
//extern unsigned char xdata *SJA_CS_Point;
//#else
//unsigned char xdata CAN_SJA_BaseAdr _at_ 0x7F00; //定義SJA1000的片選基址
//unsigned char xdata *SJA_CS_Point; //指針指向空
//#endif
unsigned char CAN_Baudrate_Filter_Buffer[9]={3,0,0,0,0,0xff,0xff,0xff,0xff};//3為發送的波特率(40kbs) 存放設置波特率和濾波器的數據
// 從機地址為0x02 其中的8為CANPC規定的
unsigned char Send_CAN_Info_ID[1]={0x82};
// 0x31~~~0x38是要發送的數據 CANPC規定發送必須為ASCII 格式 與CANPC通訊用 0x01為CANPC地址
unsigned char Send_CAN_Data[8]={0x01,0x31,0x33,0x34,0x35,0x36,0x37,0x38};//存放數據幀的數據
unsigned char ss[1]={0x08} ;
/****************************************************
單片機初始化
****************************************************/
void InitCPU(void)
{
EA =1;
IT0 =1;
EX0 =1;
PX0 =1;
}
/*---------------------------------------------------------------------------------------------------
** 函數原型: void Delay_ms(unsigned char j)
** 功能描述: 該函數用于不精確的延時。在12M,6CLK下,大約延時j*1ms
** 參數說明: 0-255
** 返回值: 無
/*------------------------------------------------------------------------------------------------*/
void Delay_ms(unsigned char j)
{
unsigned char m,n;
for(n=0;n<=j;n++)
{
for(m=0;m<=250;m++)
{
;
}
}
}
/**************************************************
函數功能:初始化 SJA1000
**************************************************/
SJA1000_Config_Normal()
{
unsigned char BTR0;
unsigned char BTR1;
unsigned char tuichu;
unsigned char mode;
unsigned char n;
BTR0=0x00;
BTR1=0x14; //設置為1M波特率通信
SJA_CS_Point=&CAN_SJA_BaseAdr;
// WriteSJAReg(REG_CAN_MOD,0x00);
SJAEntryResetMode_BCan(); //進入復位模式
mode = SJAEntryResetMode_BCan();
while(mode != 0); //SJAEntryResetMode()=0則成功進入復位模式
n = ReadSJAReg(REG_CR);
// WriteSJAReg(REG_CAN_MOD,0x01); //配置模式寄存器,選擇雙濾波、自發自收模式
// WriteSJAReg(REG_CAN_CR,0x06);
WriteSJAReg(REG_CDR,0x48); //配置時鐘分頻寄存器,選擇PeliCAN模式
n = ReadSJAReg(REG_CDR);
// mode = ReadSJAReg(REG_CAN_MOD);
// WriteSJARegBlock(16,&CAN_Baudrate_Filter_Buffer[1],8); //配置驗收代碼/屏蔽寄存器
WriteSJAReg(REG_ACR,0x00);
WriteSJAReg(REG_AMR,0xff);
// WriteSJAReg(REG_CAN_BTR0,BTR0); //配置總線定時器0x00
// WriteSJAReg(REG_CAN_BTR1,BTR1); //配置總線定時器0x14
// n = ReadSJAReg(REG_CAN_BTR1);
SJASetBandRateStandard(CAN_Baudrate_Filter_Buffer[0]);
WriteSJAReg(REG_OCR,0x1a); //配置輸出管腳,推挽輸出
// P1=0;
SJAQuitResetMode_BCan();
tuichu=SJAQuitResetMode_BCan(); //退出復位模式,進入工作模式
while(tuichu!=0); //SJAQuitResetMode()=0退出復位模式,進入工作模式
// WriteSJAReg(REG_CAN_MOD,0x00);
mode = ReadSJAReg(REG_CR);
}
main()
{
unsigned char i;
unsigned char temp_data ;
unsigned char canstatus;
unsigned char fuwei;
unsigned char Receive_CAN[11];
unsigned char Receive_CAN_ID[5];
unsigned char Receive_CAN_Data[8];
// P2=0;
InitCPU();
// for(i=0;i<128;i++)
// {
// WriteSJARegBlock((0+i),huanchong,1);
// }
Delay_ms(100);
P1=0;
Delay_ms(100);
P1=1;
Delay_ms(100);
SJA_CS_Point=&CAN_SJA_BaseAdr;
// SJATestInterface(0xaa);
// Sja1000HardwareRst(); //SJA1000硬件復位
if(SJATestInterface(0xaa)==0)
{
SJA1000_Config_Normal(); // SJA1000 進入正常模式配置
}
// fuwei = ReadSJAReg(REG_CAN_MOD);
WriteSJAReg(REG_CR,0x0E); //使能SJA1000發送中斷位
// WriteSJARegBlock(16,Send_CAN_Info_ID,5); //擴展幀,向發送緩沖區寫入5個數據
// WriteSJARegBlock(21,Send_CAN_Data,8); //擴展幀,向發送緩沖區寫入8個數據
while(1)
{
// canstatus = ReadSJAReg(REG_CAN_IER);
// if( (canstatus& 0x01)==0x01)
// {
// ReadSJARegBlock(16,Receive_CAN,13);
// }
// i=ReadSJAReg(REG_CAN_IR);
// while(ReadSJAReg(REG_CAN_IR)!=0x03)
// {
// i=ReadSJAReg(REG_CAN_IR);
// }
/*******************************************************************************************************
發送數據
*******************************************************************************************************/
temp_data =ReadSJAReg(REG_SR);
while((temp_data & 0x04) != 0x04) //有接收數據 SR.0=1 =>RXFIFO存在完整有效報文
{
temp_data =ReadSJAReg(REG_SR);
// ReadSJARegBlock(20,Receive_CAN,11); //讀出接收寄存器中的數據
}
WriteSJARegBlock(10,Send_CAN_Info_ID,1);
WriteSJARegBlock(11,ss,1);
WriteSJARegBlock(12,Send_CAN_Data,8);
WriteSJAReg(REG_CMR,0x01);
/*************************************************************************************************
接收數據
*************************************************************************************************/
temp_data =ReadSJAReg(REG_SR);
if((temp_data & 0x01) == 0x01) //有接收數據 SR.0=1 =>RXFIFO存在完整有效報文
{
// temp_data =ReadSJAReg(REG_SR);
ReadSJARegBlock(20,Receive_CAN,11); //讀出接收寄存器中的數據
}
// ReadSJARegBlock(20,Receive_CAN,11);
/*
if((canstatus& 0x44) == 0x44) //Error
{
WriteSJAReg(REG_CAN_CMR,0x04); //釋放接收緩存
SJAEntryResetMode();
WriteSJAReg(REG_CAN_RXERR,0x00);
WriteSJAReg(REG_CAN_TXERR,0x00);
SJAQuitResetMode();
return;
}
if((canstatus&0x0c) == 0x0c) //判斷是否可以發送
{
i = ReadSJAReg(REG_CAN_IR);
WriteSJARegBlock(16,Send_CAN_Info_ID,5); //擴展幀,向發送緩沖區寫入5個數據
WriteSJARegBlock(21,Send_CAN_Data,8); //擴展幀,向發送緩沖區寫入8個數據
// WriteSJAReg(REG_CAN_CMR,0x04); //釋放接受緩沖器
WriteSJAReg(REG_CAN_CMR,0x12); //使能發送請求,發送數據
// WriteSJAReg(REG_CAN_CMR,0x01);
// WriteSJAReg(REG_CAN_CMR,0x02);
i = ReadSJAReg(REG_CAN_IR);
temp_data =ReadSJAReg(REG_CAN_SR);
if((temp_data & 0x01) == 0x01) //有接收數據 SR.0=1 =>RXFIFO存在完整有效報文
{
ReadSJARegBlock(16,Receive_CAN,13); //讀出接收寄存器中的數據
}
// WriteSJAReg(REG_CAN_CMR,0x03);
// i = ReadSJAReg(REG_CAN_IR);
// if((ReadSJAReg(REG_CAN_IR)==0x01)) //查詢接收/發送中斷位
// {
// ReadSJARegBlock(16,Receive_CAN,13); //讀出接收寄存器中的數據
// }
else
{
WriteSJAReg(REG_CAN_CMR,0x04); //釋放接收緩沖區
}
}
*/
// else
// {
// Delay_ms(200);
// }
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -