请选择 进入手机版 | 继续访问电脑版
查看: 1992|回复: 0

[原创] 【LPC1768-DEV】⑥CAN总线通信

[复制链接]
  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 1995 天

    [LV.Master]伴坛终老

    23

    主题

    6158

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    11867
    最后登录
    2024-4-19
    发表于 2019-3-31 23:57:49 | 显示全部楼层 |阅读模式
    本帖最后由 yinwuqing 于 2019-4-1 00:43 编辑

          控制器局域网(CAN-Controller Area Network)属于现场总线(Fieldbus)的范畴,CAN总线在汽车电子领域用的非常普遍,具有通信速率高、可靠性强、连接方便、性能价格比高等诸多特点。它是一种有效支持分布式控制或实时控制的串行通信网络,以其短报文帧及CSMA/CD-AMP(带有信息优先权及冲突检测的载波监听多路访问)的MAC(媒介访问控制)方式而倍受工业自动化领域中设备互连的欢迎。     CAN总线以报文为单位进行信息传送,它支持4种不同类型的报文帧:数据帧、远程帧、超载帧和错误帧。报文中包含信息标识符ID,它标志了报文的优先权。CAN总线上各个节点都可主动发送,总线上的报文采用标识符ID进行仲裁,ID值越小,优先级越高。具有最高优先权报文的节点赢得总线使用权,而其它节点自动停比发送。在总线再次空闲后,这些节点将自动重发原报文。网络中的所有节点都可由ID来自动决定是否接收该报文。每个节点都有ID寄存器和屏蔽寄存器接收到的报文只有与该屏蔽的功能相同时,该节点才开始正式接收报文,否则它将不理睬ID后面的报文。这使CAN系统非常灵活,可任意扩展或改变网络组成。
             CAN帧信息传输.png     CAN原理图.png
       本次测试将CAN1L与CAN2L连接 CAN1H与CAN2H连接 插上跳线帽JP5 将开发板与电脑用9针串口线进行连接,程序通过串口输入字符,开发板接收到字符后通过CAN1发送出去,CAN2接收到CAN1发送出来的数据然后通过串口打印出来,实验现象相当于是串口发送字符然后回显出来。CAN波特率设置为500K  串口波特率9600
       根据宝马LPC1768开发板提供的一些资料,将源码补充修改移植如下:
    1. #include "lpc17xx.h"
    2. #include "can.h"
    3. #include "uart.h"
    4. /*****************************************************************************
    5. **   Main Function  main()
    6. ******************************************************************************/
    7. int main(void)
    8. {
    9.         uint8_t       i = 0;
    10.         SystemInit();                                   /*初始化目标板,切勿删除 */  
    11.                
    12.         CAN_setup(CAN1);                         /*设置CAN控制器1 */
    13.         CAN_setup(CAN2);                         /*设置CAN控制器2*/   

    14.         CAN_start(CAN1);                          /*启动CAN控制器1 */   
    15.         CAN_start(CAN2);                          /*启动CAN控制器2 */           

    16.         CAN_waitReady(CAN1);                 /*等待CAN控制器1就绪 */         
    17.         CAN_waitReady(CAN2);                 /*等待CAN控制器2就绪 */   

    18.         CAN_TxMsg[CAN1].id     = 22;        /*初始化帧信息*/
    19.         CAN_TxMsg[CAN1].len    = 1;
    20.         CAN_TxMsg[CAN1].format = STANDARD_FORMAT;
    21.         CAN_TxMsg[CAN1].type   = DATA_FRAME;
    22.         for (i = 0; i < 8; i++)
    复制代码
    1. #include "lpc17xx.h"                              /* LPC17xx definitions  */
    2. #include "uart.h"
    3. #include "can.h"

    4. volatile unsigned char UART2_BUF;
    5. void UART2_IRQHandler(void)
    6. {
    7.     uint32_t flag;
    8.     flag  = LPC_UART2->IIR;                  /* 读取(清除)中断中断状态       */
    9.     flag &= 0x0F;
    10.    
    11.     if((flag == 0X04) && (LPC_UART2->LSR & 0X01))
    复制代码
    1. #include "CAN.h"                                 
    2. CAN_FRAME        CAN_TxMsg[2];             /* 发送缓冲区    */
    3. CAN_FRAME        CAN_RxMsg[2];             /* 接收缓冲区    */
    4. unsigned int     CAN_TxRdy[2] = {0,0};   /* 发送可用标识 */
    5. unsigned int     CAN_RxRdy[2] = {0,0};   /* 接收完成标识 */

    6. /************************************************************
    7. **      波特率设置  
    8. **      NT = Nominal bit time = TSEG1 + TSEG2 + 3
    9. **      SP = Sample point     = ((TSEG2 +1) / (TSEG1 + TSEG2 + 3)) * 100%
    10. **      SAM,  SJW, TSEG1, TSEG2, NT,  SP            
    11. **************************************************************/
    12. const uint32_t CAN_BIT_TIME[] = {         
    复制代码
    1. #include "lpc17xx.h"                   /* LPC17xx definitions    */
    2. #include "uart.h"

    3. #define FOSC                        12000000                            /*  振荡器频率       */
    4. #define FCCLK                      (FOSC  * 8)                          /*  主时钟频率<=100Mhz  */
    5.                                                                                          /*  FOSC的整数倍     */
    6. #define FCCO                       (FCCLK * 3)                          /*  PLL频率(275Mhz~550Mhz)  */
    7.                                                                                          /* 与FCCLK相同,或是其的偶数倍 */
    8. #define FPCLK                      (FCCLK / 4)                          /*  外设时钟频率,FCCLK的1/2、1/4*/
    9.                                                                                         /*  或与FCCLK相同  */

    10. #define UART0_BPS     9600                                             /* 串口0通信波特率  */
    11. #define UART2_BPS     9600                                             /* 串口2通信波特率  */
    12. /*****************************************************************
    13. ** Function name:       UART0_Init
    14. ** Descriptions:           按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
    15. ** input parameters:   无
    16. ** output parameters: 无
    17. ** Returned value:      无
    18. ******************************************************************/
    19. void UART0_Init (void)
    20. {
    21.         uint16_t usFdiv;
    22.         /* UART0 */
    23.         LPC_PINCON->PINSEL0 |= (1 << 4);             /* Pin P0.2 used as TXD0 (Com0) */
    24.         LPC_PINCON->PINSEL0 |= (1 << 6);             /* Pin P0.3 used as RXD0 (Com0) */

    25.         LPC_UART0->LCR  = 0x83;                      /* 允许设置波特率    */
    26.         usFdiv = (FPCLK / 16) / UART0_BPS;         /* 设置波特率          */
    27.         LPC_UART0->DLM  = usFdiv / 256;
    28.         LPC_UART0->DLL  = usFdiv % 256;
    29.         LPC_UART0->LCR  = 0x03;                      /* 锁定波特率        */
    30.         LPC_UART0->FCR  = 0x06;                                    
    31. }

    32. /****************************************************************
    33. ** Function name:       UART0_SendByte
    34. ** Descriptions:           从串口0发送数据
    35. ** input parameters:   data: 发送的数据
    36. ** output parameters: 无
    37. ** Returned value:      无
    38. *****************************************************************/
    39. int UART0_SendByte (int ucData)
    40. {
    41.         while (!(LPC_UART0->LSR & 0x20));
    42.     return (LPC_UART0->THR = ucData);
    43. }

    44. /******************************************************************
    45. ** Function name:       UART0_GetChar
    46. ** Descriptions:        从串口0接收数据
    47. ** input parameters:    无
    48. ** output parameters:   无
    49. ** Returned value:      接收到的数据
    50. *******************************************************************/
    51. int UART0_GetChar (void)
    52. {
    53.           while (!(LPC_UART0->LSR & 0x01));
    54.           return (LPC_UART0->RBR);
    55. }

    56. /********************************************************************
    57. ** Function name:       UART0_SendString
    58. ** Descriptions:           向串口发送字符串
    59. ** input parameters:    s: 要发送的字符串指针
    60. ** output parameters:   无
    61. ** Returned value:       无
    62. *********************************************************************/
    63. void UART0_SendString (unsigned char *s)
    64. {
    65.           while (*s != 0)
    66.         {
    67.                    UART0_SendByte(*s++);
    68.         }
    69. }

    70. /********************************************************************
    71. ** Function name:       UART2_Init
    72. ** Descriptions:           按默认值初始化串口2的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
    73. ** input parameters:    无
    74. ** output parameters: 无
    75. ** Returned value:      无
    76. *********************************************************************/
    77. void UART2_Init (void)
    78. {
    79.         uint16_t usFdiv;
    80.         /* UART2 */
    81.         LPC_PINCON->PINSEL0 |= (1 << 20);             /* Pin P0.10 used as TXD2 (Com2) */
    82.         LPC_PINCON->PINSEL0 |= (1 << 22);             /* Pin P0.11 used as RXD2 (Com2) */

    83.         LPC_SC->PCONP = LPC_SC->PCONP|(1<<24);  /*打开UART2电源控制位 */

    84.         LPC_UART2->LCR  = 0x83;                                 /* 允许设置波特率      */
    85.         usFdiv = (FPCLK / 16) / UART2_BPS;                   /* 设置波特率             */
    86.         LPC_UART2->DLM  = usFdiv / 256;
    87.         LPC_UART2->DLL  = usFdiv % 256;
    88.         LPC_UART2->LCR  = 0x03;                               /* 锁定波特率             */
    89.         LPC_UART2->FCR  = 0x07;
    90.         NVIC_EnableIRQ(UART2_IRQn);                        /* 在NVIC中使能中断  */  
    91.         LPC_UART2->IER = 0x01;                                 /* 使能接收中断         */
    92. }

    93. /**********************************************************************
    94. ** Function name:       UART2_SendByte
    95. ** Descriptions:        从串口2发送数据
    96. ** input parameters:    data: 发送的数据
    97. ** output parameters:   无
    98. ** Returned value:      无
    99. ***********************************************************************/
    100. int UART2_SendByte (int ucData)
    101. {
    102.      while (!(LPC_UART2->LSR & 0x20));
    103.     return (LPC_UART2->THR = ucData);
    104. }

    105. /**********************************************************************
    106. ** Function name:       UART2_GetChar
    107. ** Descriptions:          从串口2接收数据
    108. ** input parameters:   无
    109. ** output parameters: 无
    110. ** Returned value:      接收到的数据
    111. **********************************************************************/
    112. int UART2_GetChar (void)
    113. {
    114.           while (!(LPC_UART2->LSR & 0x01));
    115.           return (LPC_UART2->RBR);
    116. }
    117. /***********************************************************************
    118. ** Function name:       UART2_SendString
    119. ** Descriptions:           UART2_SendString
    120. ** input parameters:    s: 要发送的字符串指针
    121. ** output parameters:   无
    122. ** Returned value:        无
    123. **********************************************************************/
    124. void UART2_SendString (unsigned char *s)
    125. {
    126.           while (*s != 0)
    127.         {
    128.             UART2_SendByte(*s++);
    129.         }
    130. }
    复制代码



    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 01:47 , Processed in 0.131632 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表