关于28035 eCAN的问题
我现在在做28035的eCAN的通讯,想用中断进行接收数据,但是貌似是怎么也进不去中断,各位大侠对于28035的eCAN的中断有什么需要特别注意的地方给点建议,我的程序如下#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "DSP2803x_Device.h"
void delay_loop1();
void CAN_GpioInit();
void ECAN_Init();
Uint32 Rec_H;
Uint32 Rec_L;
void main()
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
Rec_H=0;
Rec_L=0;
CAN_GpioInit();
ECAN_Init();
PieCtrlRegs.PIEIER9.bit.INTx5=1; //使能PIE中断
IER|=M_INT9; //使能CPU中断
EINT; //开全局中断
ERTM; //开实时中断
for(;;)
{
}
}
void CAN_GpioInit()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO30=0;
GpioCtrlRegs.GPAPUD.bit.GPIO31=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO30=1; //设置Gpio30工作在Ecan的模式
GpioCtrlRegs.GPAMUX2.bit.GPIO31=1; //设置Gpio31工作在ECAN的模式
GpioCtrlRegs.GPAMUX2.bit.GPIO29=0;
GpioCtrlRegs.GPADIR.bit.GPIO29=1;
EDIS;
GpioDataRegs.GPADAT.bit.GPIO29=1;
}
void ECAN_Init()
{
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC=1; //设置CANTx为ECAN的发送端口
ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all=ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC=1; //设置CANRx为ECAN的接收端口
ECanaRegs.CANRIOC.all=ECanaShadow.CANRIOC.all;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM=0; //0则是工作在正常的模式,1则是自测模式
ECanaShadow.CANMC.bit.SCB=1; //选择工作在ECAN模式下
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
ECanaMboxes.MBOX1.MSGCTRL.all=0x00000000; //初始化邮箱0的控制区域为零,
ECanaRegs.CANTA.all=0xffffffff; //清除所有的发送标志位
ECanaRegs.CANRMP.all=0xffffffff; //清除所有的接收标志位
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
EALLOW;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=1; //请求改变配置信息即时钟参数的配置
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all=ECanaRegs.CANES.all; //这里一定要注意必须要有这一句,否则的话不会去判断位CCE是否置位
}
while(ECanaShadow.CANES.bit.CCE!=1); //只有CCE置位以后才能对CANBTC进行设置
EALLOW;
ECanaRegs.CANBTC.all=0x00000000;
ECanaShadow.CANBTC.all=ECanaRegs.CANBTC.all;
ECanaShadow.CANBTC.bit.BRPREG=2;
ECanaShadow.CANBTC.bit.TSEG1REG=6;
ECanaShadow.CANBTC.bit.TSEG2REG=1;
ECanaShadow.CANBTC.bit.SAM=1;
ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=0; //请求Cpu正常工作
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all=ECanaRegs.CANES.all;
}
while(ECanaShadow.CANES.bit.CCE!=0); //等待CCE被清零
ECanaRegs.CANME.all=0; //屏蔽 所有的邮箱
ECanaMboxes.MBOX1.MSGID.all = 0X9555AAA1; //设置接收邮箱1的ID
ECanaShadow.CANMD.all=ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD1=1; //设置邮箱1作为接收邮箱
ECanaRegs.CANMD.all=ECanaShadow.CANMD.all;
//设置邮箱1的接收的数据的格式
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC=8; //邮箱1接收的数据长度为8个字节
ECanaMboxes.MBOX1.MSGCTRL.bit.RTR=0; //没有远方应答帧被请求
ECanaMboxes.MBOX1.MSGCTRL.bit.TPL=0; //优先级设置为0
//ECanaMboxes.MBOX0.MDL.all=0x01234567;//向邮箱0的RAM区域写数据
//ECanaMboxes.MBOX0.MDH.all=0x76543210;
ECanaShadow.CANME.all=ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME1=1; //使能接收邮箱1
ECanaRegs.CANME.all=ECanaShadow.CANME.all;
EALLOW;
ECanaRegs.CANMIM.all=0xffffffff; //使能全部邮箱中断
ECanaRegs.CANMIL.all=0; //邮箱中断发生在中断线0上
ECanaRegs.CANGIF0.all=0xffffffff;
ECanaRegs.CANGIF1.all=0xffffffff;
ECanaRegs.CANGIM.bit.I0EN=1; //ECANI0EN中断线使能
ECanaRegs.CANGIM.bit.I1EN=1;
ECanaRegs.CANGIM.bit.GIL=0;
EDIS;
}
interrupt void ECAN0INTA_ISR(void)
{
while(ECanaRegs.CANRMP.all!=0x00000002);
ECanaRegs.CANRMP.all=0x00000002; //复位接收请求寄存器
GpioDataRegs.GPADAT.bit.GPIO29=0; //中断进入指示
delay_loop1();
GpioDataRegs.GPADAT.bit.GPIO29=1;
Rec_L=ECanaMboxes.MBOX1.MDL.all; //接收数据
Rec_H=ECanaMboxes.MBOX1.MDH.all;
PieCtrlRegs.PIEACK.bit.ACK9=1; //中断应答
EINT;
}
void delay_loop1()
{
short i,j;
for (i = 0; i < 1000; i++)
for(j=0;j<1000;j++);
}
PieCtrlRegs.PIEIER9.bit.INTx6=1; //使能PIE中断
用这个中断试下。 wangch_sh 发表于 2013-12-30 16:42 static/image/common/back.gif
PieCtrlRegs.PIEIER9.bit.INTx6=1; //使能PIE中断
用这个中断试下。
嗯,我换了,试了一下,但是还是不行,我查看了一下寄存器,发现RMP没有置位,当我把中断去掉的时候采用查询法来接收数据的时候,程序是停在 while(ECanaRegs.CANRMP.all!=0x00000002);(我设置的邮箱1作为接收邮箱),不知道是不是我的eCAN的设置的有什么问题吗? 我做了邮箱0的发送实验是可以正常发送的(查询法) 我现在也做这个CAN实验,用中断。但是用INTX5不行,用INTX6就可以。搞不懂为什么。 wangch_sh 发表于 2013-12-30 17:56 static/image/common/back.gif
我现在也做这个CAN实验,用中断。但是用INTX5不行,用INTX6就可以。搞不懂为什么。 ...
嗯,应该是两个都是没有问题额,只要是配置好了,都是能用的,你能不能把你的那个实验成功的程序发出来参考一下啊 中断到底是产生在9.5还是9.6上是由CANGIM和CANMIL共同决定的,然后就是ID的设置,看看是否有问题,还有个帧格式的问题 kingzlt 发表于 2014-1-2 08:52 static/image/common/back.gif
中断到底是产生在9.5还是9.6上是由CANGIM和CANMIL共同决定的,然后就是ID的设置,看看是否有问题,还有个帧 ...
嗯,谢谢你的回答,我现在是先改为查询法接收再改为中断的接收,在查询接收的时候我检测的是
while(ECanaRegs.CANRMP.bit.RMP1 !=1)
{
ECanaRegs.CANRMP.all=0x00000002; //复位接收请求寄存器
Rec_L=ECanaMboxes.MBOX1.MDL.all; //接收数据
Rec_H=ECanaMboxes.MBOX1.MDH.all;
}
但是始终是停在 while(ECanaRegs.CANRMP.bit.RMP1 !=1)这里,寄存器里也是没有置位,我后来改成自测模式,邮箱0发送,邮箱1接收,可以正常发送和接收,但是一旦改成正常模式STM=0是就就收不到,CANRMP不能置位,我的CAN的设置初始化都看了很多遍了,没有什么问题的啊,不知道大家有没有这方面的经验 ECanaShadow.CANMC.bit.SUSP = 1; //bit16
不知是否有用 kingzlt 发表于 2014-1-2 11:59 static/image/common/back.gif
ECanaShadow.CANMC.bit.SUSP = 1; //bit16
不知是否有用
嗯,该位我设置了的,但还是CANRMP的相应位没有置位。你又没有单独做过eCAN的接收实验的呢? 我做过同时开8个接收邮箱,中断接收,没遇到过你这种问题 kingzlt 发表于 2014-1-2 12:37 static/image/common/back.gif
我做过同时开8个接收邮箱,中断接收,没遇到过你这种问题
你是用的28385的吗,方便把你的实验的程序发给我一份吗,我的邮箱605941063@qq.com,我找了好长时间的问题了, cjystar 发表于 2014-1-2 12:46 static/image/common/back.gif
你是用的28385的吗,方便把你的实验的程序发给我一份吗,我的邮箱605941063@qq.com,我找了好长时间的问 ...
是28035的DSP吗 希望能有帮助 kingzlt 发表于 2014-1-2 12:54 static/image/common/back.gif
希望能有帮助
嗯,好的,非常谢谢你! cjystar 发表于 2014-1-2 09:20 static/image/common/back.gif
嗯,谢谢你的回答,我现在是先改为查询法接收再改为中断的接收,在查询接收的时候我检测的是
...
我也是遇到一样的问题,不知道你是怎么解决的? csuzzp 发表于 2014-3-9 14:43 static/image/common/back.gif
我也是遇到一样的问题,不知道你是怎么解决的?
还是自己的配置的问题,后来又重新配置了,还有一个就是上位机CAN的调试软件中的数据的对其方式要选正确,我刚开始是MCP2515,后来是右对齐, 请问一下,can的两根高低线去哪买啊? 楼主的初始化能否给个工程,最近调28035的eCAN。例程的回环测试好用,改为正常模式就卡死在 while(ECanaRegs.CANTA.all != 0x0000FFFF ) {}// Wait for all TAn bits to be set.. 希望借鉴一下楼主的经验。谢谢 540709935@qq.com 我有一次波特率没有设置正确就不能进中断,希望对大家有所帮助
页:
[1]