394

帖子

0

TA的资源

一粒金砂(高级)

81
 

NO.9续!

/******************************************************************************************************************************************************
*函数名:WR_SJA(uchar sja_addr,uchar sja_data)
*功能描述: 完成先准备相应sja_addr地址,再在相应的sja_addr地址操作送sja_data数据的       过程
*函数说明: 通过ALE切换地址与数据位的操作
*调用函数:NONE
*全局变量:NONE
*输入:
*返回:
*设计者:
******************************************************************************************************************************************************/ 
void WR_SJA(uchar sja_addr,uchar sja_data)//避免编译器的MULTIPLE CALL TO SEGMENT警告。该函数在中断中被调用,避免出现错误。
{
ALE_CAN_H; //置高开启地址锁存允许,将io口的地址数据锁存。
    LPC_GPIO2->DIR = 0xFF; //默认先设定sja1000数据线为输出
    LPC_GPIO2->DATA =sja_addr;//数据输出
    delayCAN(90);
    ALE_CAN_L; //置低关闭地址锁存允许,改为发送数据有效。
delayCAN(90);
    CS_CAN_L;
WR_CAN_L;
    delayCAN(10);//调试延时
//  P1=sja_data;
//  Adress_Data_CAN_PutVal(sja_data);
 LPC_GPIO2->DATA = sja_data;
 delayCAN(120);//调试延时延长原始4
/******************************************/
 WR_CAN_H;
 CS_CAN_H; //恢复到操作前的状态,避免影响单片机对sja1000误操作。
 ALE_CAN_H;
/*****************************************/
}
/******************************************************************************************************************************************************
*函数名:RD_SJA(uchar sja_addr)
*功能描述: 完成先准备相应sja_addr地址,再将该地址的数据读出到sja_data的过程
*函数说明: 通过ALE,RD,CS的配合控制完成
*调用函数:NONE
*全局变量:NONE
*输入:
*返回:
*设计者:
******************************************************************************************************************************************************/ 
uchar RD_SJA(uchar sja_addr)
{
 uchar sja_data;
    ALE_CAN_H;//置高开启地址锁存允许,将io口的地址数据锁存。
// P1=sja_addr;
    LPC_GPIO2->DIR = 0xFF;    //默认先设定sja1000数据线为输出
    LPC_GPIO2->DATA =sja_addr;
    delayCAN(90);
    ALE_CAN_L;//置低关闭地址锁存允许,改为发送数据有效。
 delayCAN(90);
    CS_CAN_L;  //使能片选
// P1=0xFF;   //端口初始化
//  Adress_Data_CAN_PutVal(0xff);
// LPC_GPIO2->DATA = 0xff;
 RD_CAN_L;  //使能读有效
 delayCAN(30);
// Adress_Data_CAN_SetDir(0);//设定CAN的数据流方向,为输入
    LPC_GPIO2->DIR = 0x00;//设定sja1000数据线为输入
 delayCAN(10);
// sja_data=P1;
// sja_data = Adress_Data_CAN_GetVal();//读取端口数据

 sja_data = (LPC_GPIO2->DATA)
/***********************************************************/
 RD_CAN_H;//此处的3个使能一起操作,前面的写地址与写命令一样的原理
 CS_CAN_H;
 ALE_CAN_H;
/***********************************************************/ 
// Adress_Data_CAN_SetDir(1);//设定CAN的数据流方向,恢复为为输出
 LPC_GPIO2->DIR = 0xFF;    //设定CAN的数据流方向,恢复为为输出
 return sja_data;

此帖出自NXP MCU论坛
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

82
 

NO.9续续!

/******************************************************************************************************************************************************
*函数名:INT_CAN_Receive(void)
*功能描述: 该函数为中断接受处理函数的部分,为模块化,将其封装为一个函数形式
*函数说明: 没有函数入口,直接调用
*调用函数:NONE
*全局变量:NONE
*输入:
*返回:
*设计者:
******************************************************************************************************************************************************/ 
void INT_CAN_Receive(void)
{
/************************中断过程处理CAN消息
************************************************************/
        uchar k=0,j=0;
        uint i=0;
        uchar sja_addr;
        uchar RegIR=0,RegSR=0;
        uchar tempMode;
    //  Cpu_DisableInt();
        uchar ID=0;
        RegIR = RD_SJA(SJA_IR);
    /***!!!RD_SJA(SJA_IR)读出来的值为0xff,所以也可以通过进入读环节。****/                                                               
        if((RegIR&0x01)== 0x01)                 //IR中断寄存器,当接收FIFO不空和接收中断使能时置位此位
            {
            sja_addr=SJA_EFF;                   //register 17. data start address
            if(CanRxAddr>=MaxLenCanRxBuf)     //unsigned int idata MaxLenCanRxBuf=440.
                    CanRxAddr=0;
            for(k=0;k<13;k++)//完成11位标准帧数据的接收过程。----->改为收13字节,兼容标准帧
                    {  
                    CanRxBuf[CanRxAddr+k]=RD_SJA(sja_addr);
                    sja_addr++;
                    }
            WR_SJA(SJA_CMR,0x04);               //释放接收缓冲区,sja1000管脚被抬高为高电平 
            CanRxAddr+=13;
            CanRxcompleteFlag+=1;               //接收完一次完整的数据报文以后该标志位加1.
    /*****将收到的13字节的数据转存到CanTempBuf中***********************/    
            for(i=0;i<13;i++)                   //先获取一个CAN标准帧,11个字节
                    CanTempBuf =CanRxBuf[CanRxAddr-13+i];
   
    /*****CanTempBuf[]存放的13字节的数据:1字节的帧信息+最多4字节的ID消息+8字节的数据***/       
            CanFrameInf=CanTempBuf[0];//提取帧信息
            if( (CanTempBuf[0]&0x80)==0x00 )
                {
                EFF_SFF_flag=0;
                for(i=0;i<2;i ++)
                CanTxID=CanTempBuf[i+1];
                for(i=0;i<8;i++)
                CanTxData=CanTempBuf[i+3];       //收到的8位数据位
                CanSend(&CANtest[0],8);
               }
            if( (CanTempBuf[0]&0x80)==0x80)
                {
                EFF_SFF_flag=1;
                for(i=0;i<4;i ++)
                CanTxID=CanTempBuf[i+1];          
                for(i=0;i<8;i++)
                CanTxData=CanTempBuf[i+5];       //收到的8位数据位
                CanSend(&CANtest[0],8);
                }
            }
     /**********CAN容错处理
***********************************************************************/
      else if((RegIR & 0xFD)!=0)                  //can接收出错,自动退出复位状态
            {
            RegSR=RD_SJA(SJA_SR) &0xC0;     //总线关闭亦或是错误计数器满
            if(RegSR!=0)
                {
                    tempMode=RD_SJA(SJA_MOD);     //读复位寄存器
                    tempMode |=0x01;   
                    WR_SJA(SJA_MOD,tempMode);     //进入复位模式
                    WR_SJA(SJA_TXERR,0);          //清除发送错误计数
                    WR_SJA(SJA_ECC,0);
                    WR_SJA(SJA_MOD,tempMode&0xFE);//退出复位模式
                }
            }
}
上述函数有如下变量定义:
uint MaxLenCanRxBuf;
uchar CanRxBuf[260];    //20个CAN帧缓冲区------>10个
uchar CanTempBuf[13];   //单个can报文的缓冲区。
uchar CanFrameInf;      //存储帧信息字节
uchar CanTxData[8];     //CAN发送数据缓冲区
uint CanRxAddr;
uchar CanRxcompleteFlag;
/***标准帧与扩展帧的区别就是SendBufId[2]或SendBufId[4]****/
volatile uchar EFF_SFF_flag;
volatile uchar SendBufId[4];//这个值要自己设定,现在只是测试程序代码假 设的一个值11位标示符的格式,后3位可选值为20,,60,40,80,a0,e0
uchar SendBufInfo;
uint mSendDelay;
uchar CanTxID[4];

此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

83
 

NO.9续续续!

      上述的代码通过CanInit()函数的执行情况就可以大致的判断SJA1000的操作是否正确,通过对相关写入的寄存器做读出操作,如:
WR_SJA(SJA_AMR3,0xff);
I= RD_SJA(SJA_MOD);
通过判断I=0xff,是否相等来说明对SJA1000的操作的正确性的判断,如果写入SJA_AMR3地址的数据与读出来的数据是一样的,则说明对SJA1000的操作起得初步的胜利,但是是否能够顺利的进行CAN通信还与发送数据的操作以及相关的寄存器的操作相关,但是既然能够正确的操作寄存器的话,离成功也不远了。
       我在SJA1000的代码的移植上,一直不太顺利。出现某些寄存器的读写不正确,我已经尽力的将主时钟降低,同时加大时序间的延时,但是依就有几个还是有问题。表现出通信不太稳定的现象。最后怀疑我的硬件连接线的原因,因为所有的连接线都是20cm的杜邦线连接的,所以这点不容忽视。目前由于硬件电路无法克服的原因,同时不可能去找到可替代的LPC1343的PCB板重新的做布板,所以只好不再对相关的操作作深入的探讨,上面的相关代码在C8051Fxxx及飞思卡尔的平台下都没有任何的问题的实现过,本来想借这个机会扩展到LPC1343上,但是目前视乎没有什么可以改进的地方,soso姐送的LPC1343已经被我搞的没有人型料。
       本来想实现一个LPC1343的CAN总线节点与ZLG的CAN转接卡的配套二次开发的,但是硬件上的原件不可能做更多的更改,自己写的基于c#上位机软件也不能拿来展示实际的效果。但是咱EEWORLD的旗帜还是得竖上去,呵呵。展示一下该上位机软件的效果图,该软件为相关接口卡的二次开发的,同时自己也添加上自己写的串口调试助手的功能。

实现简单的串口调试以及数据监测作用。采用串口件直接做的,通过相关参数修改得到一些不同波特率以及不可串口编号的端口的操作。


        实现的目标功能是上位机软件发送数据到LPC1343的CAN节点,同时LPC1343收到确认无误的数据帧以后做相关的回应。这个过程的实现基本上可以说明由PC端到转接卡,然后再到LPC1343的过程是完好的,目前主要是LPC1343+SJA1000的数据链路没办法正确的建立,这点很是遗憾。愧对SOSO姐与EEWORLD的期望。当然其他的同学要是有更好的条件实现的话,亦或是以后有谁个做这个PCB的话我还是很愿意接着做这个LPC1343+SJA1000的探讨的。然后在实现整个的系统的建立。
       至此相关CAN总线的硬件、软件分析已经完成,本人也将所有的经历全部的投入到新的领域的学习中希望以后能够借助EEWORLD这个平台结识更多的朋友与同仁。感谢在这期间给予我不断支持与帮助的soso姐以及EEWORLD网站。感谢NXP的Lpcxpresso_LPC1343的DEMO板,虽然你们可能、或许、肯定会恨我。因为我没有在LPCXpresso软件上做相关的技术交流与推广,同时也没有拿着你的板子去研究那个憋足的LPC-LINK功能,而是去做MDK+JLINK的交流。或许这个与你们的初衷不太一致,但是我还是由衷的感谢你的这块板子,你也得谢谢我这个潜藏的客户,为你们的这个片子做的努力。
           
                                                                                                                      -----------------西城 6/10/2010 11:54:40 PM


本贴可以满足个人对LPC1343的入门需求,尤其是MDK+JLINK平台的建立,有指导性的借鉴作用。
论坛地址:
https://bbs.eeworld.com.cn/thread-103644-1-1.html 会持续的解决相关网友的提问。同时如果有相关的技术问题,还请论坛跟帖探讨。都是新人不要有啥顾忌,本人也是血肉之躯也会犯错。希望得到大伙的指正@@!

[ 本帖最后由 pepsi360 于 2010-6-11 00:32 编辑 ]
此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

84
 
版主改标题:MDK+JLINKv7+LPC1343之攻略探讨交流(6月11日第9次更新,CAN总线终结篇。)
此帖出自NXP MCU论坛
 
 
 

回复

2万

帖子

71

TA的资源

管理员

85
 
很精彩 :)
此帖出自NXP MCU论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

86
 

话说这个EEWORLD_TOOLS V1.2不会是soso帮你代工的吧??咱还有他的签名呢@@,专业定做的还是,哎!!

此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

87
 
最近忙啊,呵呵。转眼一个月没料
此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

88
 
楼主的奉献精神让人感动,非常精彩,赞一个!
此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

89
 

原帖由 allen_linux 于 2010-6-13 11:00 发表 楼主的奉献精神让人感动,非常精彩,赞一个!

哪里哪里啊,一起努力啊!呵呵

此帖出自NXP MCU论坛
 
 
 

回复

826

帖子

0

TA的资源

一粒金砂(中级)

90
 

多谢LZ帮我解决了下载的问题

原来总是不行,;P LZ今天中午帮我弄了一个中午,终于弄好了,再次特别感谢西城LZ,O(∩_∩)O~ 山寨的JLINK就是稍微有点小问题,不过这个就是便宜。

下面上图调试好了第一个了,有图有真相

[localimg=600,450]2[/localimg][localimg=600,450]3[/localimg][localimg=600,450]4[/localimg][localimg=600,450]5[/localimg][localimg=600,450]6[/localimg]

终于解决了

此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

91
 

原帖由 lilong8470 于 2010-6-13 15:49 发表 原来总是不行,;P LZ今天中午帮我弄了一个中午,终于弄好了,再次特别感谢西城LZ,O(∩_∩)O~ 山寨的JLINK就是稍微有点小问题,不过这个就是便宜。下面上图调试好了第一个了,有图有真相48306[loca ...

没啥啦,呵呵。一起学习、进步!

此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

92
 

§ 6月18日更新NO.10

将本贴做了一个归档,也让各位同学,朋友们方便阅读。还是希望多多的提意见与建议@@谢谢~~

 

MDK+JLINKv7+Lpcxpresso_LPC1343之初步攻略(6月11日第9次更新,CAN总线终结篇).pdf (6.49 MB, 下载次数: 226, 售价: 1 分芯积分)

此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

93
 

§ 6月18日更新NO.10续!

斑竹改标题:MDK+JLINKv7+LPC1343之攻略探讨交流(6.18更新,将本贴归档整理为PDF##92楼层下载。)

 

[ 本帖最后由 pepsi360 于 2010-6-18 15:28 编辑 ]
此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

94
 

原帖由 pepsi360 于 2010-6-18 15:06 发表 将本贴做了一个归档,也让各位同学,朋友们方便阅读。还是希望多多的提意见与建议@@谢谢~~   48432

感谢分享。前辈@

此帖出自NXP MCU论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

95
 

不错,学习了!

不错,下载了!
此帖出自NXP MCU论坛
 
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

96
 

原帖由 fortune158 于 2010-6-19 15:03 发表 不错,下载了!

有啥问题常来反馈下啊!@@

此帖出自NXP MCU论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

97
 
不错,下载了!
此帖出自NXP MCU论坛
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

98
 

好东西,谢谢

好东西,谢谢,下载了
此帖出自NXP MCU论坛
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

99
 
好东西,谢谢,下载了
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

100
 
怎么没有看到用ULINK仿真的??????????
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表