?? sja1000.c
字號:
#include "upio.h"
#include "sja1000.h"
#include "csp.h"
#include "Dpram.h"
#define Debug_SJA1000
#ifdef Debug_SJA1000
#define GIC 0xFFFFF000
#define GIC_IECR 0x120
#define GIC_EOICR 0x130
#define INTNUM 28 //sja0對應GIC的28號
#endif
#define SJA1000_ALE_H ALE_H()
#define SJA1000_ALE_L ALE_L()
#define SJA1000_RD_H RD_H()
#define SJA1000_RD_L RD_L()
#define SJA1000_WR_H WR_H()
#define SJA1000_WR_L WR_L()
#define SJA1000_RST_H RST_H()
#define SJA1000_RST_L RST_L()
#define SJA1000_CS0_H CS0_H()
#define SJA1000_CS0_L CS0_L()
#define SJA1000_CS1_H CS1_H()
#define SJA1000_CS1_L CS1_L()
extern void DRIVER_AsmSJAInterruptHandler(void);
static int gnIntError = 0;
static void MyDelay(int _delay){
while(_delay>0)
_delay -= 4;
}
void SJA1000_IO_CS_Init( void )
{
unsigned short k;
InitSJAPio();
SJA1000_ALE_L ; //SI put 0
SJA1000_RD_H; //SCK put 0
SJA1000_WR_H;
SJA1000_RST_H;
SJA1000_CS0_H;
MyDelay(300*NS_Cycle); //延時至少300ns
}
unsigned char SJA1000Read(unsigned char Address)
{
unsigned short k;
unsigned char data;
SJA1000_ALE_H;
UPIO_SetData(Address);
MyDelay(8*NS_Cycle+1); //延時至少8ns,Add建立到ALE=0,8ns,ALE碼沖寬度8ns
SJA1000_ALE_L;
MyDelay(10*NS_Cycle+1); //延時至少10ns,ALE=0到RD=0,10ns,并且AD上地址保持至少2ns
SJA1000_CS0_L;
SJA1000_RD_L;
MyDelay(40*NS_Cycle+1); //延時至少40ns,RD從0到1,40ns
UPIO_GetData(&data);
//MyDelay(10*NS_Cycle+1); //延時至少40ns,RD從0到1,40ns
SJA1000_RD_H;
SJA1000_CS0_H;
SJA1000_ALE_H;
return data;
}
//功能:寫一個字節,直接尋址
//傳遞參數:地址,寫數據
//返回參數:無
void SJA1000Write(unsigned char Address,unsigned char value)
{
SJA1000_ALE_H;
UPIO_SetData(Address);
MyDelay(8*NS_Cycle+1); //延時至少8ns,Add建立到ALE=0,8ns,ALE碼沖寬度8ns
SJA1000_ALE_L;
MyDelay(10*NS_Cycle+1); //延時至少10ns,ALE=0到WR=0,10ns,并且AD上地址保持至少2ns
SJA1000_CS0_L;
SJA1000_WR_L;
MyDelay(10*NS_Cycle+1); //延時至少20ns,WR從0到1,20ns
UPIO_SetData(value);
MyDelay(20*NS_Cycle+1); //延時至少20ns,WR從0到1,20ns,數據建立到WR=1,8ns
SJA1000_WR_H;
SJA1000_CS0_H;
MyDelay(15*NS_Cycle+1); //延時至少15ns,data保持8ns,WR=1到下一次ALE=1,15ns
SJA1000_ALE_H;
}
void CanSetBaudrate(unsigned int baud)
{
int i;
switch(baud)
{
case 100:
SJA1000Write(REG_BTR0,0x04);
SJA1000Write(REG_BTR1,0x3a);
break;
case 125:
SJA1000Write(REG_BTR0,0x03);
SJA1000Write(REG_BTR1,0x3a);
break;
case 200:
SJA1000Write(REG_BTR0,0x03);
SJA1000Write(REG_BTR1,0x25);
break;
case 250:
SJA1000Write(REG_BTR0,0x01);
SJA1000Write(REG_BTR1,0x3c);
break;
case 400:
SJA1000Write(REG_BTR0,0x01);
SJA1000Write(REG_BTR1,0x25);
break;
case 500:
SJA1000Write(REG_BTR0,0x00);
SJA1000Write(REG_BTR1,0x49);
break;
case 800:
SJA1000Write(REG_BTR0,0x00);
SJA1000Write(REG_BTR1,0x25);
break;
case 1000:
SJA1000Write(REG_BTR0,0x00);
SJA1000Write(REG_BTR1,0x23);
break;
default:
//default baud rate equal 500k bit/s
SJA1000Write(REG_BTR0,0x00);
SJA1000Write(REG_BTR1,0x49);
break;
}
}
int SJA1000_Reset(unsigned int bandrate)
{
unsigned int acr,amr;
//unsigned char tmp;
acr = 0;
amr = 0xffffffff;
//1.復位模式
//tmp = (SJA1000Read(REG_MR);
SJA1000Write(REG_MR, BIT_RM);
if(!(SJA1000Read(REG_MR) & 0x01))
return -1;
//1.1設置時鐘分頻CDR,pelican模式
SJA1000Write(REG_CDR,SJA1000Read(REG_CDR)|0x80);
//1.3設置AMR,ACR。acr0對應標識符的MSB
SJA1000Write((unsigned char)REG_ACR0,(volatile unsigned char)(acr>>24)); //驗收碼寄存器0
SJA1000Write((unsigned char)(REG_ACR0+1),(volatile unsigned char)(acr>>16)); //驗收碼寄存器0
SJA1000Write((unsigned char)(REG_ACR0+2),(volatile unsigned char)(acr>>8)); //驗收碼寄存器0
SJA1000Write((unsigned char)( REG_ACR0+3),(volatile unsigned char)acr); //驗收碼寄存器0
SJA1000Write((unsigned char)REG_AMR0,(volatile unsigned char)(amr>>24)); //驗收屏蔽寄存器0
SJA1000Write((unsigned char)(REG_AMR0+1),(volatile unsigned char)(amr>>16)); //驗收屏蔽寄存器0
SJA1000Write((unsigned char)(REG_AMR0+2),(volatile unsigned char)(amr>>8)); //驗收屏蔽寄存器0
SJA1000Write((unsigned char)(REG_AMR0+3),(volatile unsigned char)amr); //驗收屏蔽寄存器0
//1.2設置總線時序寄存器
CanSetBaudrate(bandrate); //設置波特率
//1.4設置輸出控制寄存器
SJA1000Write(REG_OC,0xfa);//??
//2.使能接收、發送、出錯、數據溢出、喚醒中斷
SJA1000Write(REG_IER, DIS_IRQ);//先禁止所有中斷
//SJA1000Write(REG_IER, BIT_RIE|BIT_TIE|BIT_EIE|BIT_DOIE|BIT_WUIE);
SJA1000Write(REG_IER, BIT_RIE|BIT_EIE|BIT_DOIE|BIT_WUIE);//沒有發送中斷
SJA1000Read(REG_IER);
//3.正常模式
//SJA1000Write(REG_MR,0x0C);//單濾波,正常,自檢測
SJA1000Write(REG_MR,0x00);//雙濾波,正常
if(SJA1000Read(REG_MR) & 0x01)
return -1;
else
0;
}
void Init_SJA1000(unsigned int bandrate)
{
unsigned char i,j,a;
SJA1000_IO_CS_Init() ;
SJA1000_Reset(bandrate);
//設置GIC的相關
*(volatile int *)(GIC+4*INTNUM) = 0x01;//模式寄存器,低電平觸發,優先級1,最低
*(volatile int *)(GIC+4*32+4*INTNUM) = (int)DRIVER_AsmSJAInterruptHandler;//中斷處理函數
*(volatile int *)(GIC+GIC_IECR) = 1<<INTNUM;//中斷使能
//CSP_GICConfigInterrupt(INTNUM, 0x61, DRIVER_AsmSJAInterruptHandler);
}
void SJA1000_TX(CanMessageStruct * msg)
{
unsigned char x,i;
unsigned char tmp;
while(!(SJA1000Read(REG_SR)&BIT_TBS));
x = 0;
if(msg->Rtr)
{
x |= 0x40;
}
x |= msg->DataLengthCode;
if(msg->IsExt){
//是擴展楨
x |= 0x80;
SJA1000Write(16,x);
x = (unsigned char)((msg->Identifier) >> 21);
SJA1000Write(17,x); //寫標示符1
x = (unsigned char)((msg->Identifier) >> 13);
SJA1000Write(18,x); //寫標示符2
x = (unsigned char)((msg->Identifier) >> 5);
SJA1000Write(19,x); //寫標示符3
x = (unsigned char)((msg->Identifier) & 0x1F);
x <<= 3;
SJA1000Write(20,x); //寫標示符4
for(i = 0; i < msg->DataLengthCode; i++){
SJA1000Write(21+i,msg->Data[i]); //寫數據
}
}
else{
//標準楨
SJA1000Write(16,x);
x = (unsigned char)((msg->Identifier) >> 3);
SJA1000Write(17,x); //寫標示符1
x = (unsigned char)((msg->Identifier) & 0x07);
x <<= 5;
SJA1000Write(18,x); //寫標示符2
for(i = 0; i < msg->DataLengthCode; i++){
SJA1000Write(19+i,msg->Data[i]); //寫數據
}
}
SJA1000Write(REG_CMR,BIT_TR); //請求發送
}
void SJA1000_RX(CanMessageStruct * msg)
{
unsigned char x,i;
while(!(SJA1000Read(REG_SR)&BIT_RBS));
//return;//沒有報文
x = SJA1000Read(16);
msg->IsExt = (x & 0x80) ? 1:0;//是否擴展楨
msg->Rtr = (x & 0x40) ? 1:0;//是否遠程楨
msg->DataLengthCode = x & 0x0f;
if(msg->IsExt){
x = SJA1000Read(17);
msg->Identifier = ((unsigned int)x)<< 21;
x = SJA1000Read(18);
msg->Identifier |= ((unsigned int)x) << 13;
x = SJA1000Read(19);
msg->Identifier |= ((unsigned int)x) << 5;
x = SJA1000Read(20);
msg->Identifier |= ((unsigned int)x) >> 3;
for(i = 0; i < msg->DataLengthCode; i ++)
{
msg->Data[i] = SJA1000Read(21+i); //讀數據
}
}
else{
x = SJA1000Read(17);
msg->Identifier = ((unsigned int)x)<< 3;
x = SJA1000Read(18);
msg->Identifier |= ((unsigned int)x) >> 5;
for(i = 0; i < msg->DataLengthCode; i ++)
{
msg->Data[i] = SJA1000Read(19+i); //讀數據
}
}
SJA1000Write(REG_CMR,BIT_RR);//釋放接收緩沖區,自動清除中斷位
}
void SJA_isr(void)
{
unsigned char x = 0, nStatus = 0;
int i = 0;
static int count = 0;
int num = 0;
CanMessageStruct msg2;
x = SJA1000Read(REG_IR);//get Interrupt source
if(x&BIT_RI){//Receive Interrupt
//SJA1000_RX(&msg2);
//SJA1000_TX(&msg1);
SJA1000_RX(&msg2);
WriteRx(&msg2);
}
if(x&BIT_TI){
;
}
if(x&BIT_EI){
SJA1000_Reset(500);
}
if(x&BIT_DOI){
;
}
if(x&BIT_WUI){
;//nWakeNum++;no use now
}
*(volatile int *)(GIC+GIC_EOICR) = 1;//訪問這個寄存器通知GIC中斷被處理
}
//測試讀寫時序
void TestTiming(){
unsigned char i=0;
char tmp[24];
SJA1000_IO_CS_Init() ;
SJA1000Write(0,1);
SJA1000Write(REG_CDR,SJA1000Read(REG_CDR)|0x80);
for(i=1;i<24;i++){
SJA1000Write(i,i+1);
tmp[i] = SJA1000Read(i);
}
return;
}
void TsetSJA(void)
{
int i;
CanMessageStruct msg1,msg2;
unsigned char data_write[8]={1,2,3,4,5,6,7,8};
unsigned char data_read[8] ;
Init_SJA1000(500);
__CLI();
msg1.Identifier = 0x5a5;
msg1.Rtr = 0;
msg1.DataLengthCode = 8;
for(i=0;i<8;i++)
msg1.Data[i] = i+1;
msg1.IsExt = 1;
// SJA1000_TX(&msg1);
// while(1)
// {
// SJA1000Read(REG_IR);
//SJA1000_TX(&msg1);
// SJA1000_RX(&msg2);
// }
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -