你好像没有复位啊?SR应为0x0c时才能发送,先硬件复位,再进入复位模式。硬件复位后要等一两个微秒才能读写寄存器。
我的初始化程序和主程序如下:
//sja1000复位
void can_reset(void)
{
PORTE &=~BIT(PE0);//低电平有效
delay_us(2);
PORTE|=BIT(PE0); //复位结束
delay_us(2);
}
void sja1000_init(void)
{
Write_Sja1000(MOD,0x01);
while(!(Read_Sja1000(MOD)&0x01))
{
Write_Sja1000(MOD,0x01);
}
XBYTE[CDR]=0xC8;//时钟分频寄存器, 选择PeliCAN模式,关闭时钟输出(CLKOUT)
XBYTE[OCR]=0x1a;//输出控制寄存器
XBYTE[IER]=0xFF;//
XBYTE[BTR0]=0x00;//1000Kbps,总线定时寄存器
XBYTE[BTR1]=0x14;
XBYTE[AC0]=0x00;// 接收代码寄存器
XBYTE[AC1]=0x00;
XBYTE[AC2]=0x00;
XBYTE[AC3]=0x00;
XBYTE[ACM0]=0xFF;//接收屏蔽寄存器
XBYTE[ACM1]=0xFF;
XBYTE[ACM2]=0xFF;
XBYTE[ACM3]=0xFF;
XBYTE[IR]=0x00;
XBYTE[RXERR]=0x00;
XBYTE[TXERR]=0x00;
XBYTE[BSA]=0x00;
XBYTE[CMR]=0x04;
XBYTE[MOD]=0x04;//退出复位模式
while(XBYTE[MOD] != 0x04)
{
Write_Sja1000(MOD,0x04);
}
}
void Send_Data(void)
{
uchar state;
//初始化标示码头信息
send_buf[0] = 0x88; //.7=1--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节
send_buf[1] = 0x00; //本帧信息的ID
send_buf[2] = 0x00;
send_buf[3] = 0x00;
send_buf[4] = 0x00;
//初始化发送数据单元
send_buf[5] = 0x00;//发送的第1个字节数据
send_buf[6] = 0x02; //2
send_buf[7] = 0x03; //3
send_buf[8] = 0x04; //4
send_buf[9] = 0x05; //5
send_buf[10] = 0x06; //6
send_buf[11] = 0x07; //7
send_buf[12] = 0x08; //8
//初始化数据信息
CLI(); //关闭全局中断
//查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行
do
{
state = XBYTE[SR]; ////SR为SJA1000的状态寄存器
}while( state & 0x10 ); //SR.4=1 正在接收,等待直到 SR.4=0
//---------查询SJA1000是否处于发送完毕状态----------//
do
{
state = XBYTE[SR];
}while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1
//---------------查询发送缓冲器状态-----------------//
do
{
state = XBYTE[SR];
}while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1
//将待发送的一帧数据信息存入SJA1000的相应寄存器中
XBYTE[TXF] = send_buf[0];
XBYTE[TXI1] = send_buf[1];
XBYTE[TXI2] = send_buf[2];
XBYTE[TXI3] = send_buf[3];
XBYTE[TXI4] = send_buf[4];
XBYTE[TXD1] = send_buf[5];
XBYTE[TXD2] = send_buf[6];
XBYTE[TXD3] = send_buf[7];
XBYTE[TXD4] = send_buf[8];
XBYTE[TXD5] = send_buf[9];
XBYTE[TXD6] = send_buf[10];
XBYTE[TXD7] = send_buf[11];
XBYTE[TXD8] = send_buf[12];
XBYTE[CMR] = 0x10; //自接收
SEI(); //开启CPU中断
}
void main(void)
{
unsigned int tmp=0;
CLI(); //disable all interrupts
Port_Init();
uart_int();
can_reset();
delay_us(5);
sja1000_init();
delay_us(10);
Send_Data();
}
|