共2条
1/1 1 跳转至页
can 老师、工程师们帮我分析一下这段can的初始化和收发程序
问
大家帮我看看下面的程序,程序后有程序的说明,我是真心求教,大家不吝赐教吧,思路也可以啊
#include "vxWorks.h"
#include "ioLib.h"
#include "stdioLib.h"
#include "intLib.h"
#include "taskLib.h"
#define SJA_REG_BaseADD 0x000d0000 /*第一个CAN口*/
#define SJA_BaseADD 0x000d0200 /*第二个CAN口*/
#define REG_MODE *(UINT32 *)(SJA_REG_BaseADD + 0x00)
#define REG_CMD *(UINT32 *)(SJA_REG_BaseADD + 0x01)
#define REG_SR *(UINT32 *)(SJA_REG_BaseADD + 0x02)
#define REG_IR *(UINT32 *)(SJA_REG_BaseADD + 0x03)
#define REG_IR_ABLE *(UINT32 *)(SJA_REG_BaseADD + 0x04)
#define REG_amr *(UINT32 *)(SJA_REG_BaseADD + 0x05)
#define REG_BTR0 *(UINT32 *)(SJA_REG_BaseADD + 0x06)
#define REG_BTR1 *(UINT32 *)(SJA_REG_BaseADD + 0x07)
#define REG_OCR *(UINT32 *)(SJA_REG_BaseADD + 0x08)
#define REG_buf01 *(UINT32 *)(SJA_REG_BaseADD + 0x0a)
#define REG_buf02 *(UINT32 *)(SJA_REG_BaseADD + 0x0b)
#define REG_buf03 *(UINT32 *)(SJA_REG_BaseADD + 0x0c)
#define REG_buf04 *(UINT32 *)(SJA_REG_BaseADD + 0x0d)
#define REG_buf05 *(UINT32 *)(SJA_REG_BaseADD + 0x0e)
#define REG_buf06 *(UINT32 *)(SJA_REG_BaseADD + 0x0f)
#define REG_CDR *(UINT32 *)(SJA_REG_BaseADD + 0x1f)
#define MODE *(UINT32 *)(SJA_BaseADD + 0x00)
#define CMD *(UINT32 *)(SJA_BaseADD + 0x01)
#define SR *(UINT32 *)(SJA_BaseADD + 0x02)
#define IR *(UINT32 *)(SJA_BaseADD + 0x03)
#define IR_ABLE *(UINT32 *)(SJA_BaseADD + 0x04)
#define amr *(UINT32 *)(SJA_BaseADD + 0x05)
#define BTR0 *(UINT32 *)(SJA_BaseADD + 0x06)
#define BTR1 *(UINT32 *)(SJA_BaseADD + 0x07)
#define OCR *(UINT32 *)(SJA_BaseADD + 0x08)
#define buf01 *(UINT32 *)(SJA_BaseADD + 0x0a)
#define buf02 *(UINT32 *)(SJA_BaseADD + 0x0b)
#define buf03 *(UINT32 *)(SJA_BaseADD + 0x0c)
#define buf04 *(UINT32 *)(SJA_BaseADD + 0x0d)
#define buf05 *(UINT32 *)(SJA_BaseADD + 0x0e)
#define buf06 *(UINT32 *)(SJA_BaseADD + 0x0f)
#define CDR *(UINT32 *)(SJA_BaseADD + 0x1f)
void send(void);
void receive(void);
void temp(void);
unsigned int i;
unsigned int j;
main()
{
unsigned int send_B,reveive_B,temp_B;
for(j=0;j<10;j++) /*延迟*/
{
for(i=0;i<0xffff;i++);
for(i=0;i<0xffff;i++);
}
/*第一个sja1000初始化*/
REG_MODE=0x1; /*进入复位模式*/
REG_CDR = 0x08; /*Basic模式 不输出时钟*/
REG_amr =0xff; /*验收屏蔽寄存器*/
REG_BTR0=0x00; /*总线定时寄存器设置500k*/
REG_BTR1=0x1c;
REG_OCR=0x1a; /*输出控制寄存器*/
REG_MODE=0x0; /*进入工作模式*/
/*第二个sja1000初始化*/
MODE=0x1; /*进入复位模式*/
CDR = 0x00; /*Basic模式 不输出时钟*/
amr =0xff;
BTR0=0x00;
BTR1=0x1c;
OCR=0x1a;
MODE=0x0;
reveive_B=taskSpawn("t2",100,0x100,2000,(FUNCPTR)receive,0,0,0,0,0,0,0,0,0,0);/*发起接受任务*/
send_B=taskSpawn("t1",101,0x100,2000,(FUNCPTR)send,0,0,0,0,0,0,0,0,0,0);/*发起发送任务*/
}
/*发送任务*/
void send(void)
{
unsigned char status,error_flag=0;
while(1)
{
status=REG_SR; /*读状态寄存器*/
if((status&0x10)==0x10) error_flag=1; /*CAN控制器正在接收信息*/
if((status&0x08)==0) error_flag=2; /*发送完毕1*/
if((status&0x04)==0) error_flag=3; /*发送缓冲器释放1*/
if(error_flag==0) /*当发送完毕且已经释放了发送缓冲区时*/
{
printf("******sr =%x******",status);
REG_buf01=0x11; /*设置标识、帧格式及发送数据个数*/
REG_buf02=0x04;
REG_buf03=0x55; /*要发送的数据写入发送缓冲区*/
REG_buf04=0x66;
REG_buf05=0x77;
REG_buf06=0x88;
status=REG_SR;
printf("\n@@@@@@ahead sr =%x@@@@@@",status);
REG_CMD =0x01; /*发送命令*/
status=REG_SR;
printf("\n@@@@@@after send sr =%x@@@@@@",status);
}
if(error_flag!=0) printf("\nerror! ID is %d",error_flag);
taskDelay(100); /*延迟一秒*/
error_flag=0;
}
}
/*接收程序*/
void receive(void)
{
unsigned char status,number,re_data[10];
while(1)
{
status=SR; /*读状态寄存器*/
printf("\nstate=%x",status);
if((SR&0x01)==0x01) /*接收缓冲区满*/
{
printf("\nreceived");
if((buf02&0x10)==0) /*如果是数据帧*/
{
number=(buf02&0x0f)+2; /*统计数据个数*/
}
else /*是远程帧*/
{
number=2; /*远程祯的长度为二*/
}
for(i=0;i<number;i++) /*接收数据,无论是数据祯还是远程祯*/
{
re_data[i]=*(UINT32 *)(SJA_BaseADD+i);/*把缓冲区中的数据读入数组*/
}
CMD=0x04; /*清空(释放)接收缓冲区*/
}
taskDelay(20); /*延迟三分之一秒*/
}
}
说明:1、使用ISA9620的两个CAN控制器sja1000进行通信,一个发送一个接收,之间用串行线连接起来,在win2000下用周立功公司的调试界面可以实现互发数据,说明电路是通的。
2、上面是我的在wxworks下的简单的sja1000初始化和收发程序,顺序是先进行初始化(两个CAN口都初始化),然后发起两
个任务,一个发送,一个接收。
3、初始化好像没有什么异常,进入工作模式,状态寄存器是0x0c,第一个CAN发送,在发送缓冲区中写入数据后,设置命令
寄存器0x01来启动发送,但之后再读状态寄存器就变为0x00(未释放发送缓冲且发送未成功)或者0xf4(总线错误,关闭)
,之后的循环就都是0x00或0xf4;第二个CAN接收程序一直没有收到数据,状态一直是0x0c(我是用查询方式接收数据)。
4、我在另一台机器上安装了PCI9820的CAN接口卡,和这台机器上的ISA9620进行通信(运行vxworks操作系统),设置相同
的总线定时寄存器值,但无论是哪边收另一边收都无法通信,指示灯会闪,但收不到数据,上面的发送程序一运行启动发送
会出现相同的错误。
5、非常老师、工程师给我看一下,我这边非常着急,希望尽快给我答复,上面是vxworks下的程序,但可以当做c下的
程序来看,因为vxworks兼容标准c语法。我的初始化和收发好像是差了什么没有设置或者设错了或者顺序有问题,请无论如
何指点一下,再次致谢。
田野
13798239314
答 1: 上面说明中有个地方写错了,改一下上面说明3中,寄存器是变为c4不是f4,我写错了,大家作过的给一些指导吧,请问有没有哪位朋友有调通的程序代码,给我一份好吗,真的很着急
ilf137@sina.com 谢谢 答 2: 自己顶一下,急切盼望中哪位高手出手相助阿, 答 3: 这怎么办我向周立功技术支持咨询,他们告诉我,他们的卡ISA9620 PCI9820等都只支持对寄存器的访问,但即使程序百分之百正确也不能实现收发,因为他们在电路上有内在的保密技术,对命令寄存器设置启动发送是发不到总线上的,来的数据也不会自动接收。他们不能提供技术支持。
熟悉这张卡的朋友、老师我想问一下是这么回事吗,还有什么办法啊 答 4: help真的没人管啊,起码安慰一下也好啊
#include "vxWorks.h"
#include "ioLib.h"
#include "stdioLib.h"
#include "intLib.h"
#include "taskLib.h"
#define SJA_REG_BaseADD 0x000d0000 /*第一个CAN口*/
#define SJA_BaseADD 0x000d0200 /*第二个CAN口*/
#define REG_MODE *(UINT32 *)(SJA_REG_BaseADD + 0x00)
#define REG_CMD *(UINT32 *)(SJA_REG_BaseADD + 0x01)
#define REG_SR *(UINT32 *)(SJA_REG_BaseADD + 0x02)
#define REG_IR *(UINT32 *)(SJA_REG_BaseADD + 0x03)
#define REG_IR_ABLE *(UINT32 *)(SJA_REG_BaseADD + 0x04)
#define REG_amr *(UINT32 *)(SJA_REG_BaseADD + 0x05)
#define REG_BTR0 *(UINT32 *)(SJA_REG_BaseADD + 0x06)
#define REG_BTR1 *(UINT32 *)(SJA_REG_BaseADD + 0x07)
#define REG_OCR *(UINT32 *)(SJA_REG_BaseADD + 0x08)
#define REG_buf01 *(UINT32 *)(SJA_REG_BaseADD + 0x0a)
#define REG_buf02 *(UINT32 *)(SJA_REG_BaseADD + 0x0b)
#define REG_buf03 *(UINT32 *)(SJA_REG_BaseADD + 0x0c)
#define REG_buf04 *(UINT32 *)(SJA_REG_BaseADD + 0x0d)
#define REG_buf05 *(UINT32 *)(SJA_REG_BaseADD + 0x0e)
#define REG_buf06 *(UINT32 *)(SJA_REG_BaseADD + 0x0f)
#define REG_CDR *(UINT32 *)(SJA_REG_BaseADD + 0x1f)
#define MODE *(UINT32 *)(SJA_BaseADD + 0x00)
#define CMD *(UINT32 *)(SJA_BaseADD + 0x01)
#define SR *(UINT32 *)(SJA_BaseADD + 0x02)
#define IR *(UINT32 *)(SJA_BaseADD + 0x03)
#define IR_ABLE *(UINT32 *)(SJA_BaseADD + 0x04)
#define amr *(UINT32 *)(SJA_BaseADD + 0x05)
#define BTR0 *(UINT32 *)(SJA_BaseADD + 0x06)
#define BTR1 *(UINT32 *)(SJA_BaseADD + 0x07)
#define OCR *(UINT32 *)(SJA_BaseADD + 0x08)
#define buf01 *(UINT32 *)(SJA_BaseADD + 0x0a)
#define buf02 *(UINT32 *)(SJA_BaseADD + 0x0b)
#define buf03 *(UINT32 *)(SJA_BaseADD + 0x0c)
#define buf04 *(UINT32 *)(SJA_BaseADD + 0x0d)
#define buf05 *(UINT32 *)(SJA_BaseADD + 0x0e)
#define buf06 *(UINT32 *)(SJA_BaseADD + 0x0f)
#define CDR *(UINT32 *)(SJA_BaseADD + 0x1f)
void send(void);
void receive(void);
void temp(void);
unsigned int i;
unsigned int j;
main()
{
unsigned int send_B,reveive_B,temp_B;
for(j=0;j<10;j++) /*延迟*/
{
for(i=0;i<0xffff;i++);
for(i=0;i<0xffff;i++);
}
/*第一个sja1000初始化*/
REG_MODE=0x1; /*进入复位模式*/
REG_CDR = 0x08; /*Basic模式 不输出时钟*/
REG_amr =0xff; /*验收屏蔽寄存器*/
REG_BTR0=0x00; /*总线定时寄存器设置500k*/
REG_BTR1=0x1c;
REG_OCR=0x1a; /*输出控制寄存器*/
REG_MODE=0x0; /*进入工作模式*/
/*第二个sja1000初始化*/
MODE=0x1; /*进入复位模式*/
CDR = 0x00; /*Basic模式 不输出时钟*/
amr =0xff;
BTR0=0x00;
BTR1=0x1c;
OCR=0x1a;
MODE=0x0;
reveive_B=taskSpawn("t2",100,0x100,2000,(FUNCPTR)receive,0,0,0,0,0,0,0,0,0,0);/*发起接受任务*/
send_B=taskSpawn("t1",101,0x100,2000,(FUNCPTR)send,0,0,0,0,0,0,0,0,0,0);/*发起发送任务*/
}
/*发送任务*/
void send(void)
{
unsigned char status,error_flag=0;
while(1)
{
status=REG_SR; /*读状态寄存器*/
if((status&0x10)==0x10) error_flag=1; /*CAN控制器正在接收信息*/
if((status&0x08)==0) error_flag=2; /*发送完毕1*/
if((status&0x04)==0) error_flag=3; /*发送缓冲器释放1*/
if(error_flag==0) /*当发送完毕且已经释放了发送缓冲区时*/
{
printf("******sr =%x******",status);
REG_buf01=0x11; /*设置标识、帧格式及发送数据个数*/
REG_buf02=0x04;
REG_buf03=0x55; /*要发送的数据写入发送缓冲区*/
REG_buf04=0x66;
REG_buf05=0x77;
REG_buf06=0x88;
status=REG_SR;
printf("\n@@@@@@ahead sr =%x@@@@@@",status);
REG_CMD =0x01; /*发送命令*/
status=REG_SR;
printf("\n@@@@@@after send sr =%x@@@@@@",status);
}
if(error_flag!=0) printf("\nerror! ID is %d",error_flag);
taskDelay(100); /*延迟一秒*/
error_flag=0;
}
}
/*接收程序*/
void receive(void)
{
unsigned char status,number,re_data[10];
while(1)
{
status=SR; /*读状态寄存器*/
printf("\nstate=%x",status);
if((SR&0x01)==0x01) /*接收缓冲区满*/
{
printf("\nreceived");
if((buf02&0x10)==0) /*如果是数据帧*/
{
number=(buf02&0x0f)+2; /*统计数据个数*/
}
else /*是远程帧*/
{
number=2; /*远程祯的长度为二*/
}
for(i=0;i<number;i++) /*接收数据,无论是数据祯还是远程祯*/
{
re_data[i]=*(UINT32 *)(SJA_BaseADD+i);/*把缓冲区中的数据读入数组*/
}
CMD=0x04; /*清空(释放)接收缓冲区*/
}
taskDelay(20); /*延迟三分之一秒*/
}
}
说明:1、使用ISA9620的两个CAN控制器sja1000进行通信,一个发送一个接收,之间用串行线连接起来,在win2000下用周立功公司的调试界面可以实现互发数据,说明电路是通的。
2、上面是我的在wxworks下的简单的sja1000初始化和收发程序,顺序是先进行初始化(两个CAN口都初始化),然后发起两
个任务,一个发送,一个接收。
3、初始化好像没有什么异常,进入工作模式,状态寄存器是0x0c,第一个CAN发送,在发送缓冲区中写入数据后,设置命令
寄存器0x01来启动发送,但之后再读状态寄存器就变为0x00(未释放发送缓冲且发送未成功)或者0xf4(总线错误,关闭)
,之后的循环就都是0x00或0xf4;第二个CAN接收程序一直没有收到数据,状态一直是0x0c(我是用查询方式接收数据)。
4、我在另一台机器上安装了PCI9820的CAN接口卡,和这台机器上的ISA9620进行通信(运行vxworks操作系统),设置相同
的总线定时寄存器值,但无论是哪边收另一边收都无法通信,指示灯会闪,但收不到数据,上面的发送程序一运行启动发送
会出现相同的错误。
5、非常老师、工程师给我看一下,我这边非常着急,希望尽快给我答复,上面是vxworks下的程序,但可以当做c下的
程序来看,因为vxworks兼容标准c语法。我的初始化和收发好像是差了什么没有设置或者设错了或者顺序有问题,请无论如
何指点一下,再次致谢。
田野
13798239314
答 1: 上面说明中有个地方写错了,改一下上面说明3中,寄存器是变为c4不是f4,我写错了,大家作过的给一些指导吧,请问有没有哪位朋友有调通的程序代码,给我一份好吗,真的很着急
ilf137@sina.com 谢谢 答 2: 自己顶一下,急切盼望中哪位高手出手相助阿, 答 3: 这怎么办我向周立功技术支持咨询,他们告诉我,他们的卡ISA9620 PCI9820等都只支持对寄存器的访问,但即使程序百分之百正确也不能实现收发,因为他们在电路上有内在的保密技术,对命令寄存器设置启动发送是发不到总线上的,来的数据也不会自动接收。他们不能提供技术支持。
熟悉这张卡的朋友、老师我想问一下是这么回事吗,还有什么办法啊 答 4: help真的没人管啊,起码安慰一下也好啊
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |