在线时间6 小时
UID1624604
注册时间2009-4-24
NXP金币0
该用户从未签到
注册会员

- 积分
- 52
- 最后登录
- 2019-7-25
|
写的飞思卡尔MC9S12DT128的CAN驱动程序,发现三个缓冲区不会清零,总是满的(动作三次就停止了),有哪个高人知道什么原因阿?初始化问题吗?开启自循环测试则正常。总线FBUS=12MHZ. 这个原因是不是因为初始化没设置好阿???
void CANInit(void)
{
byte i;
CAN0CTL0_INITRQ = 1; //请求进入初始化模式
while (CAN0CTL1_INITAK == 0); //等待应答进入初始化模式
CAN0CTL1_CANE = 1; //MSCAN12模块使能
CAN0CTL1_CLKSRC = 1; //时钟源选择总线时钟fmscan=12M (默认为晶振的一半)
CAN0CTL1_LISTEN = 0; //侦听模式禁止
CAN0CTL1_LOOPB = 0; //关闭自环测试模式
CAN0BTR0_SJW = 0;
CAN0BTR0_BRP = 5;
CAN0BTR1_SAMP = 0;
CAN0BTR1_TSEG_20 = 2;
CAN0BTR1_TSEG_10 = 3; //BTR0=0X05;BTR1=0X23
//CAN0BTR0 = 0x43; //同步跳转宽度为1Tq,预分频因子为6。
//CAN0BTR1 = 0x18; //单次采样,时间段2为3Tq,时间段1为4Tq,故位速率=24M/2/6/(3+4+1)=250kbps
CAN0IDMR0 = 0xFF;
CAN0IDMR1 = 0xFF;
CAN0IDMR2 = 0xFF;
CAN0IDMR3 = 0xFF;
CAN0IDMR4 = 0xFF;
CAN0IDMR5 = 0xFF;
CAN0IDMR6 = 0xFF;
CAN0IDMR7 = 0xFF; //关闭过滤器,接收所有地址消息
CAN0TIER = 0x00; //禁止发送中断
CAN0RIER = 0x00; //禁止接收中断
CAN0CTL0_INITRQ = 0; //退出初始化模式
while (CAN0CTL1_INITAK == 1); //等待关闭初始化模式
for(i=0;i<255;i++)
{
if(CAN0CTL0_SYNCH==1)
break;
}
//while (!CAN0CTL0_SYNCH); //等待总线通信时钟同步(连到总线是需要判断同步)
CAN0RFLG_RXF = 1; //清空消息接受缓冲器
CAN0RIER_RXFIE = 1; //使能接收消息中断
}发送函数: /***CAN发送函数*****************************************************/void CAN_send(mscan_T_msg msg) //发送8个数{ byte Txbuffer,i; Txbuffer = 0; /* if(CAN0TFLG == 0x00) CAN0TFLG = 0x07;*/ while(!CAN0TFLG); //等待发送缓冲器可用 /* { CAN0TFLG=0x05; } */ CAN0TBSEL = CAN0TFLG; Txbuffer = CAN0TBSEL; //选择可用的buffer CAN0TXIDR0 = (byte) (msg.Tx_ID>>8); CAN0TXIDR1 = (byte) msg.Tx_ID; CAN0TXDLR = msg.Tx_Length; CAN0TXTBPR = msg.Tx_Prio; for(i=0;i<msg.Tx_Length;i++) *(&CAN0TXDSR0 + i) = msg.Tx_Data; CAN0TFLG = Txbuffer;}
|
|