具体调试程序如下,希望大侠们帮我看看问题出在哪?谢谢.
串口和定时器都调通了,灯也调通了.我得调试思路是,在主程序中每隔10秒向can网发数据,同时产生can中断,在can中断中发数据,在can中断中点一个灯,结果发现在can中断中点的灯怎么也不亮,不知道问题出在哪,希望帮我看看下边的程序.
main()
{
init_can_controller();
......
ECAN=1;
while()
{
/*每隔10秒向CAN网发数据*/
CANCON = 0x01; /*发送中断*/
}
}
CAN网初始化函数
void init_can_controller(void)
{
/* 进入CAN控制器复位模式 */
CANMOD = 0x01; /* 将CAN控制器设置为复位模式以启动初始化 */
/* TXDC Port (P1.1) 配置 */
/* 管脚TXDC 设置为推挽模式 */
P1M2 = P1M2 | 0x02; /* P1M2.1=’1’, P1M1.1 = ’0’ (默认) */
/* 配置与CAN有关的中断 */
CANSTA = 0x03; /* 使能接收和发送中断 */
/* CAN位定时的配置 */
CANADR = 0x06; /* BTR0和BTR1编程为125 kbit/s @12 MHz */
CANDAT = 0x45;
CANADR = 0x07; /* TSEG1 = 12, TSEG2 = 3, SJW = 2 */
CANDAT = 0x2B; /* Samples = 1 -> sample point ~81 % */
/* 选择操作模式退出CAN控制器复位模式 */
CANMOD = 0x00;
while (CANSTA & 0x80); /*等待总线激活*/
}
CAN网中断函数
void ECAN_int_service(void) interrupt 13 using 2 /* 高优先级 */
{
unsigned char xdata CANADR_save;
/*在此处点一个灯*/
InterruptRegCopy = CANCON; /* 读中断寄存器 */
CANADR_save = CANADR; /* 保存CANADR */
/* CAN 发送中断 */
if ((InterruptRegCopy & 0x02) == 0x02)
{
/* 发送中断处理 */
TX_Service ();
CanTraBufferFlag=0; /*00表示发送can缓冲区没有数据,1表示发送缓冲区有数据*/
CANCON=0x00;
}
/* CAN接收中断 */
if ((InterruptRegCopy & 0x01) == 0x01)
{
do {
RX_Service();
Can_Identifer_Define();
CanRecBufferFlag=1; /*00表示接收can缓冲区没有数据,1表示接收缓冲区有数据*/
}
while (RBS); /* 接收缓冲区是否清空 */
}
CANADR = CANADR_save; /* 恢复CANADR */
/* ----- EX0_int_service结束 ----- */
}
/*************************************************
CAN中断处理函数
*************************************************/
void ECAN_int_service(void) interrupt 13
{
REG_CANADR = REG_CAN_IR;
InterruptRegCopy = REG_CANDAT; //读出CAN中断状态
CANADR_save = REG_CANADR;
if((InterruptRegCopy & 0x01) == 0x01)
{
//接收中断
}
if((InterruptRegCopy & 0x02) == 0x02)
{
//发送中断处理
}
if((InterruptRegCopy & 0x80) == 0x80)
{
//总线出错处理
}
REG_CANADR = CANADR_save;
}
你试试先~~
都是跑通了的
初始化波特率写入的值那里我不太肯定,忘了,你自己查一下