专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
NXP
mc9s12xep100芯片调试CAN通讯,我现在是把CAN的发送函数写好了,怎么从中断发送出去?
2019-07-15 17:09
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
NXP MCU
2174
1
948
本人是新手一枚,最近适用mc9s12xep100
芯片
调试CAN通讯,恳求大牛指点呀!!!
我现在是把CAN的发送函数写好了,但是不知道怎么从中断发送出去
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
lhf2013803
2019-07-15 22:14
main函数里初始化CAN配置,使能中断,死循环里赋值发送数据,调用发送函数,即可发出。
如
/*************************************************************/
/* 初始化CAN0 */
/*************************************************************/
void INIT_CAN0(void)
{
if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态
CAN0CTL0_INITRQ =1; // 进入初始化状态
while (CAN0CTL1_INITAK==0); //等待进入初始化状态
CAN0BTR0_SJW = 0; //设置同步
CAN0BTR0_BRP = 7; //设置波特率
CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s
// 关闭滤波器
CAN0IDMR0 = 0xFF;
CAN0IDMR1 = 0xFF;
CAN0IDMR2 = 0xFF;
CAN0IDMR3 = 0xFF;
CAN0IDMR4 = 0xFF;
CAN0IDMR5 = 0xFF;
CAN0IDMR6 = 0xFF;
CAN0IDMR7 = 0xFF;
CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源
CAN0CTL0 = 0x00; //返回一般模式运行
while(CAN0CTL1_INITAK); //等待回到一般运行模式
while(CAN0CTL0_SYNCH==0); //等待总线时钟同步
CAN0RIER_RXFIE = 0; //禁止接收中断
}
/*************************************************************/
/* CAN0发送 */
/*************************************************************/
Bool MSCAN0SendMsg(struct can_msg msg)
{
unsigned char send_buf, sp;
// 检查数据长度
if(msg.len > 8)
return(FALSE);
// 检查总线时钟
if(CAN0CTL0_SYNCH==0)
return(FALSE);
send_buf = 0;
do
{
// 寻找空闲的缓冲器
CAN0TBSEL=CAN0TFLG;
send_buf=CAN0TBSEL;
}
while(!send_buf);
// 写入标识符
CAN0TXIDR0 = (unsigned char)(msg.id>>3);
CAN0TXIDR1 = (unsigned char)(msg.id<<5);
if(msg.RTR)
// RTR = 阴性
CAN0TXIDR1 |= 0x10;
// 写入数据
for(sp = 0; sp < msg.len; sp++)
*((&CAN0TXDSR0)+sp) = msg.data[sp];
// 写入数据长度
CAN0TXDLR = msg.len;
// 写入优先级
CAN0TXTBPR = msg.prty;
// 清 TXx 标志 (缓冲器准备发送)
CAN0TFLG = send_buf;
return(TRUE);
}
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_CAN0();
EnableInterrupts;
//填写报文内容
msg_send.id = ID;
for(k=0;k<data_len_TX;k++)
{
msg_send.data[k] = senddata[k];
}
msg_send.len = data_len_TX;
msg_send.RTR = FALSE;
msg_send.prty = 0;
for(;;)
{
delay1ms(500);
if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
for(;;);
}
}
加载中...
一周热门
更多
>
相关问题
手把手学会例程系列:i.MX<二>:图解i.mx53源码补丁+烧录(...
59 个回答
从零开始MQX开发之二 创建与调试MQX项目
24 个回答
7009: Trim value invalid, value is blank or zero是什么错误
0 个回答
怎么头像消失啊?
23 个回答
求推荐KINETIS评估板:必备USB HS,ETHERNET
5 个回答
相关文章
基于IMX6Q移植uboot2018-09——添加单板
0个评论
IMX6UL定时器按键消抖实验
0个评论
I.MX6U处理器LED灯点亮汇编程序代码编写
0个评论
在NXP I.MX6上做一个基于Opencv和OpenGL的打砖块游戏
0个评论
【RFID安全】浅谈卡片破解
0个评论
LM75a
0个评论
emwin字库制作及汉字显示
0个评论
STM32学习之I2C
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
NXP
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/*************************************************************/
/* 初始化CAN0 */
/*************************************************************/
void INIT_CAN0(void)
{
if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态
CAN0CTL0_INITRQ =1; // 进入初始化状态
while (CAN0CTL1_INITAK==0); //等待进入初始化状态
CAN0BTR0_SJW = 0; //设置同步
CAN0BTR0_BRP = 7; //设置波特率
CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s
// 关闭滤波器
CAN0IDMR0 = 0xFF;
CAN0IDMR1 = 0xFF;
CAN0IDMR2 = 0xFF;
CAN0IDMR3 = 0xFF;
CAN0IDMR4 = 0xFF;
CAN0IDMR5 = 0xFF;
CAN0IDMR6 = 0xFF;
CAN0IDMR7 = 0xFF;
CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源
CAN0CTL0 = 0x00; //返回一般模式运行
while(CAN0CTL1_INITAK); //等待回到一般运行模式
while(CAN0CTL0_SYNCH==0); //等待总线时钟同步
CAN0RIER_RXFIE = 0; //禁止接收中断
}
/*************************************************************/
/* CAN0发送 */
/*************************************************************/
Bool MSCAN0SendMsg(struct can_msg msg)
{
unsigned char send_buf, sp;
// 检查数据长度
if(msg.len > 8)
return(FALSE);
// 检查总线时钟
if(CAN0CTL0_SYNCH==0)
return(FALSE);
send_buf = 0;
do
{
// 寻找空闲的缓冲器
CAN0TBSEL=CAN0TFLG;
send_buf=CAN0TBSEL;
}
while(!send_buf);
// 写入标识符
CAN0TXIDR0 = (unsigned char)(msg.id>>3);
CAN0TXIDR1 = (unsigned char)(msg.id<<5);
if(msg.RTR)
// RTR = 阴性
CAN0TXIDR1 |= 0x10;
// 写入数据
for(sp = 0; sp < msg.len; sp++)
*((&CAN0TXDSR0)+sp) = msg.data[sp];
// 写入数据长度
CAN0TXDLR = msg.len;
// 写入优先级
CAN0TXTBPR = msg.prty;
// 清 TXx 标志 (缓冲器准备发送)
CAN0TFLG = send_buf;
return(TRUE);
}
void main(void) {
DisableInterrupts;
INIT_PLL();
INIT_CAN0();
EnableInterrupts;
//填写报文内容
msg_send.id = ID;
for(k=0;k<data_len_TX;k++)
{
msg_send.data[k] = senddata[k];
}
msg_send.len = data_len_TX;
msg_send.RTR = FALSE;
msg_send.prty = 0;
for(;;)
{
delay1ms(500);
if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
for(;;);
}
}
一周热门 更多>