在线时间2 小时
UID2073637
注册时间2015-12-18
NXP金币0
该用户从未签到
新手上路

- 积分
- 21
- 最后登录
- 2016-1-6
|
MC9S08DZ60芯片与CAN分析仪不能通信
下面是我的CAN配置程序 波特率设置500K,请帮忙解答一下 谢谢!
//#define TIME_SEGM1 4 /* Time Segment 1 = 5 */
//#define TIME_SEGM2 1 /* Time Segment 2 = 2 */
/* TSEG1 + TSEG2 + SYNCH_SEG = 8 time quantas */
/* Prescaler = CANCLK/(Baud rate * time quantas) = 8MHz/(500kHz * 8) = 2 */
//#define CAN_PRESC 1 /* Baud rate prescaler = 1 */
//#define CAN_SYNJW 1 /* Sinchronization jump width = 2 clock cycles */
void MSCANInit(void)
{
char sj,p;
char t_seg1, t_seg2;
if (CANCTL0_INITRQ==0) // 查询是否进入初始化状态
CANCTL0_INITRQ =1; // 进入初始化状态
while (CANCTL1_INITAK==0) //等待进入初始化状态
__RESET_WATCHDOG();
sj = (CAN_SYNJW)<<6;
p = (CAN_PRESC);
// 设置 SJW 、Tq、 位时间长度等
CANBTR0 = (sj|p); //设置同步及波特率
t_seg1 = (TIME_SEGM1);
t_seg2 = (TIME_SEGM2)<<4;
// 设置 Time Segment 1 and 2
CANBTR1 = (t_seg1 | t_seg2); //时段1和时段2 的tp个数
CANIDAC = 0x00; //two 32-bit acceptance filters
//below is the set of acceptance filter and its mask register,recieve all message (添加)
CANIDAR0 = 0xff;//0xff;
CANIDAR1 = 0xff;//0xff;
CANIDAR2 = 0xff;
CANIDAR3 = 0xff;
CANIDAR4 = 0xff;//0xff;
CANIDAR5 = 0xff;//0xf7;
CANIDAR6 = 0xff;
CANIDAR7 = 0xff;//添加
// 关闭滤波器
CANIDMR0 = 0xFF;
CANIDMR1 = 0xFF;
CANIDMR2 = 0xFF;
CANIDMR3 = 0xFF;
CANIDMR4 = 0xFF;
CANIDMR5 = 0xFF;
CANIDMR6 = 0xFF;
CANIDMR7 = 0xFF; //
// 使能MSCAN模块 设置为一般运行模式、使用内部时钟源
CANCTL1 = 0x80;
// 返回一般模式运行
CANCTL0 = 0x00;
// 等待回到一般运行模式
while(CANCTL1_INITAK) __RESET_WATCHDOG();
// 等待总线时钟同步
while(CANCTL0_SYNCH==0) __RESET_WATCHDOG();
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANSendMsg
// --------------------------------------------------------------------------------------
// MSCAN Send Message Routine
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANSendMsg(struct can_msg msg)
{
unsigned char n_tx_buf, i;
// 检查数据长度
if(msg.len > MAX_LEN)
return(FALSE);
// 检查总线时钟
if(CANCTL0_SYNCH==0)
return(FALSE);
n_tx_buf = 0;
// 寻找空闲的缓冲器
/* do
{
CANTBSEL=CANTFLG;
n_tx_buf=CANTBSEL;
}
while(!n_tx_buf); */
if(CANTFLG_TXE)
{
CANTBSEL_TX=CANTFLG_TXE;
n_tx_buf=1;
}
// 写入标识符
CANTIDR0 = (unsigned char)(msg.id>>3);
CANTIDR1 = (unsigned char)(msg.id<<5);
if(msg.RTR)
// RTR = 阴性
CANTIDR1 |= 0x10;
// 写入数据
for(i = 0; i < msg.len; i++)
*((&CANTDSR0)+i) = msg.data;
// 写入数据长度
CANTDLR = msg.len;
// 写入优先级
CANTTBPR = msg.prty;
// 清 TXx 标志 (缓冲器准备发送)
//CANTFLG = n_tx_buf;
CANTFLG_TXE= CANTBSEL_TX; //
CANTIER_TXEIE=CANTBSEL_TX;//添加调试
return(TRUE);
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANGetMsg
// --------------------------------------------------------------------------------------
// MSCAN Get Message Routine
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANGetMsg(struct can_msg *msg)
{
unsigned char i;
// 检测接收标志
if(!(CANRFLG&0x02))
return(FALSE);
// 检测 CAN协议报文模式 (一般/扩展) 标识符
if(CANRIDR1&0x08)
// IDE = Recessive (Extended Mode)
return(FALSE);
// 读标识符
msg->id = (unsigned int)(CANRIDR0<<3) |
(unsigned char)(CANRIDR1>>5);
if(CANRIDR1&0x10)
msg->RTR = TRUE;
else
msg->RTR = FALSE;
// 读取数据长度
msg->len = CANRDLR;
// 读取数据
for(i = 0; i < msg->len; i++)
msg->data = *((&CANRDSR0)+i);
// 清 RXF 标志位 (缓冲器准备接收)
CANRFLG = 0x01;
return(TRUE);
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANCheckRcvdMsg
// --------------------------------------------------------------------------------------
// Verify if a new message is available in the Receiver Buffer Register
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANCheckRcvdMsg(void)
{
// 检测接收标志位
if(CANRFLG&0x01)
return(TRUE);
else return(FALSE);
}
|
|