[DemoCode下载] CAN总线主从收发示例

[复制链接]
593|3
 楼主| xuanhuanzi 发表于 2022-12-20 15:07 | 显示全部楼层 |阅读模式
en-us--[Example_Code]_CANbus_test_based_on_NM1530.zip (513.33 KB, 下载次数: 6)
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.0
  4. * $Revision: 1 $
  5. * $Date: 05/12/22 10:30p $
  6. * @brief
  7. *           
  8. *           
  9. * @note
  10. * Copyright (C) 2022 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "NM1530.h"
  15. #include <string.h>
  16. #include <math.h>
  17. #include "system_initialize.h"

  18. #define CAN_BAUD_RATE                     500000
  19. #define Master_ISP_ID                     0xA3
  20. #define Device0_ISP_ID                    0xA2

  21. #define Get_Model_Id                                                                                        0x20
  22. #define Get_FW_Version_Id                                                                        0x21

  23. #define CLK_LED1                                                                                                        P33

  24. #define C_Frame_Length                                                                                4
  25. #define Frame_Start                                                                                                0
  26. #define Frame_LED_1                                                                                                1
  27. #define Frame_LED_2                                                                                                2
  28. #define Frame_End                                                                                                        3

  29. void Test_BasicMode_Tx(CAN_T  *tCAN);

  30. uint32_t unItem, BaudRate = 0, RealBaudRate = 0;
  31. uint8_t u8CAN_PackageFlag = 0, u8CAN_AckFlag = 0;

  32. typedef struct{
  33.         uint32_t bit0:1;
  34.         uint32_t bit1:1;
  35.         uint32_t bit2:1;
  36.         uint32_t bit3:1;
  37.         uint32_t bit4:1;
  38.         uint32_t bit5:1;
  39.         uint32_t bit6:1;
  40.         uint32_t bit7:1;
  41.         uint32_t bit8:1;
  42.         uint32_t bit9:1;
  43.         uint32_t bit10:1;
  44.         uint32_t bit11:1;
  45.         uint32_t bit12:1;
  46.         uint32_t bit13:1;
  47.         uint32_t bit14:1;
  48.         uint32_t bit15:1;
  49.         uint32_t bit16:1;
  50.         uint32_t bit17:1;
  51.         uint32_t bit18:1;
  52.         uint32_t bit19:1;
  53.         uint32_t bit20:1;
  54.         uint32_t bit21:1;
  55.         uint32_t bit22:1;
  56.         uint32_t bit23:1;
  57.         uint32_t bit24:1;
  58.         uint32_t bit25:1;
  59.         uint32_t bit26:1;
  60.         uint32_t bit27:1;
  61.         uint32_t bit28:1;
  62.         uint32_t bit29:1;
  63.         uint32_t bit30:1;
  64.         uint32_t bit31:1;
  65. }data_bit_t;

  66. typedef union {
  67.         uint32_t data_32;
  68.         data_bit_t data_bit;
  69. }serial_data_t;

  70. serial_data_t serial_data;

  71. typedef struct{
  72.         uint32_t mode;
  73.         uint32_t dim;
  74.         uint32_t blue;
  75.         uint32_t green;
  76.         uint32_t red;
  77. }LED_Frame_t;
  78. LED_Frame_t LED1_Frame[4];
  79. LED_Frame_t LED1_Frame_reverse[4];

  80. uint32_t record[3];

  81. typedef struct{
  82.         uint32_t R;
  83.         uint32_t G;
  84.         uint32_t B;
  85.         uint32_t valid;
  86. }Color_t;
  87. Color_t Color;

  88. typedef struct{
  89.         uint8_t Tag;
  90.         uint8_t CmdID;
  91.         uint8_t Length;
  92.         uint8_t Data[10];
  93.         uint8_t CRC;
  94. }IX_t;
  95. IX_t IX;
  96.        
  97. extern void CAN_Response_Get_Model_Id(CAN_T *tCAN,STR_CANMSG_T *msg);
  98. extern void CAN_Response_Get_FW_Version(CAN_T *tCAN,STR_CANMSG_T *msg);
  99. extern Color_t HSVtoRGB(float H, float S,float V);

  100. extern void CAN_Set_LED_Steady(CAN_T *tCAN,uint16_t C_H,uint8_t Bitmap,uint8_t steady);
  101. extern void CAN_Set_LED_Blink(CAN_T *tCAN,uint16_t C_H,uint8_t Bitmap,uint8_t Interval_T,uint8_t Fadein_T,uint8_t Keep_T,uint8_t Fadeout_T);
  102.        
  103. __align(4) STR_CANMSG_T rrMsg;
  104. STR_CANMSG_T tMsg;
  105. uint8_t  rrMsg_record_Data[8];
  106. uint16_t test_on,Led_steady_on,input_C_H,input_Bitmap,input_steady;
  107. float C_H,C_S,C_V;
  108. uint8_t input_Interval_T,input_Fadein_T,input_Keep_T,input_Fadeout_t;
  109. uint16_t Led_Blink_on;
  110. uint16_t read_record[8];

  111. STR_CANMSG_T msg1;

  112. void CAN_MsgInterrupt(CAN_T *tCAN, uint32_t u32IIDR)
  113. {
  114.     if(u32IIDR == 1)
  115.     {
  116.         CAN_Receive(tCAN, MSG(0), &rrMsg);
  117.                                 if(rrMsg.DLC)
  118.                                         u8CAN_PackageFlag = 1;
  119.     }
  120. }
  121. uint16_t reset_can;
  122. void CAN_IRQHandler(void)
  123. {
  124.                 uint32_t u8IIDRstatus;
  125.                 u8IIDRstatus = CAN->IIDR;
  126.        
  127.        
  128.   if(u8IIDRstatus == 0x00008000)        /* Check Status Interrupt Flag (Error status Int and Status change Int) */
  129.     {
  130.         /**************************/
  131.         /* Status Change interrupt*/
  132.         /**************************/
  133.         if(CAN->STATUS & CAN_STATUS_RXOK_Msk)
  134.         {
  135.             CAN->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/
  136.                                 }

  137.         if(CAN->STATUS & CAN_STATUS_TXOK_Msk)
  138.         {
  139.             CAN->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/
  140.             u8CAN_AckFlag = 0;
  141.         }
  142.                                 if(        CAN->STATUS & CAN_STATUS_BOFF_Msk){
  143.                                                 CAN->STATUS &= ~CAN_STATUS_BOFF_Msk;
  144.                                                 reset_can = 1;
  145.                                 }
  146.     }
  147.           else if((u8IIDRstatus >= 0x1) || (u8IIDRstatus <= 0x20))
  148.     {
  149.         CAN_MsgInterrupt(CAN, u8IIDRstatus);

  150.         CAN_CLR_INT_PENDING_BIT(CAN, (u8IIDRstatus - 1)); /* Clear Interrupt Pending */
  151.     }
  152.                
  153.                
  154. }

  155. uint16_t Data_Cnt;
  156. uint16_t Frame_Length,Frame_Cnt;
  157. uint16_t Set_LED1;

  158. void TMR0_IRQHandler(void){
  159.        
  160.         TIMER_ClearIntFlag(TIMER0);

  161.         if(!test_on)
  162.                 test_on = 1;

  163. }
  164. /*---------------------------------------------------------------------------------------------------------*/
  165. /* MAIN function                                                                                           */
  166. /*---------------------------------------------------------------------------------------------------------*/
  167. int main(void)
  168. {       
  169.     /* Unlock protected registers */
  170.     SYS_UnlockReg();

  171.     /* Init System, IP clock */
  172.     SYS_Init_Clock();
  173.                 /* Init multi-function I/O */
  174.                 GPIO->PWMPOEN = 0;
  175.                 Initialize_GPIO();
  176.                
  177.                 /* Configure UART0 and set UART0 baud rate */
  178.     UART_Open(UART0, 115200);
  179.     /* Lock protected registers */
  180.     SYS_LockReg();

  181.                 printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  182.     printf("+------------------------------------------------+\n");
  183.        
  184.                 Initialize_Timer0();
  185.        
  186.     /*---------------------------------------------------------------------------------------------------------*/
  187.     /* SAMPLE CODE                                                                                             */
  188.     /*---------------------------------------------------------------------------------------------------------*/
  189.                
  190.                 BaudRate = CAN_BAUD_RATE ;
  191.     RealBaudRate = CAN_Open(CAN,  BaudRate, CAN_NORMAL_MODE);//Set target baud-rate and operation mode.
  192.                 /* Enable CAN interrupt */
  193.     CAN_EnableInt(CAN, (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk));
  194.     /* Set Interrupt Priority */
  195.     NVIC_SetPriority(CAN_IRQn, 0/*(1 << __NVIC_PRIO_BITS) - 2*/);
  196.     /* Enable External Interrupt */
  197.     NVIC_EnableIRQ(CAN_IRQn);
  198.                 /* Set CAN reveive message */
  199.     CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  200.                
  201.                 CLK_LED1 = 1;
  202.                 test_on =1;
  203.     while(1){
  204.                        
  205.                         if(reset_can){
  206.                                 reset_can = 0;
  207.                                 RealBaudRate = CAN_Open(CAN,  BaudRate, CAN_NORMAL_MODE);//Set target baud-rate and operation mode.
  208.                                 /* Enable CAN interrupt */
  209.                                 CAN_EnableInt(CAN, (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk));
  210.                                 /* Set CAN reveive message */
  211.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  212.                         }       
  213.                        
  214.                         CLK_LED1 ^=1;
  215.                        
  216.                         if(u8CAN_PackageFlag){
  217.                                 u8CAN_PackageFlag = 0;
  218.                                 if(rrMsg.Data[0]){
  219.                                         memcpy(rrMsg_record_Data,rrMsg.Data,8);
  220.                                         memset(rrMsg.Data,NULL,8);
  221.                                 }
  222.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  223.                         }
  224.                         if(test_on){
  225.                                 test_on = 0;
  226.                                 Test_BasicMode_Tx(CAN);
  227.                                 CLK_SysTickDelay(10000);
  228.                         }
  229.                         if(Led_steady_on){
  230.                                 Led_steady_on = 0;
  231.                                 CAN_Set_LED_Steady(CAN,input_C_H,input_Bitmap,input_steady);
  232.                         }
  233.                         if(Led_Blink_on){
  234.                                 Led_Blink_on = 0;
  235.                                 CAN_Set_LED_Blink(CAN,input_C_H,input_Bitmap,input_Interval_T,input_Fadein_T,input_Keep_T,input_Fadeout_t);                       
  236.                         }
  237.                 }

  238. }

  239. /*----------------------------------------------------------------------------*/
  240. /*  Send Tx Msg by Basic Mode Function (Without Message RAM)                  */
  241. /*----------------------------------------------------------------------------*/
  242. uint16_t CC_H;
  243. uint8_t Bitmap;
  244. uint8_t steady;
  245. void Test_BasicMode_Tx(CAN_T  *tCAN)
  246. {
  247.     int32_t delaycount;
  248.     delaycount = 1000;

  249.     /* Send Message No.1 */
  250.     msg1.FrameType = CAN_DATA_FRAME;
  251.     msg1.IdType   = CAN_STD_ID;
  252.     msg1.Id       = Device0_ISP_ID;
  253.     msg1.DLC      = 8;
  254.     msg1.Data[0]  = 0xFE        ;       
  255.     msg1.Data[1]  = 0x8;
  256.                 msg1.Data[2]  = 0x23;
  257.                 msg1.Data[3]  = CC_H & 0xFF;
  258.                 msg1.Data[4]  = (CC_H>>8) & 0xFF;
  259.                 msg1.Data[5]  = Bitmap;
  260.                 msg1.Data[6]  = steady;
  261.                 msg1.Data[7]  = 0x0;

  262.     CAN_Transmit(tCAN, MSG(0), &msg1);//Send CAN message
  263.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  264. }

  265. void CAN_Response_Get_Model_Id(CAN_T *tCAN,STR_CANMSG_T *msg){
  266.                 uint8_t ModelId[3],Len;
  267.        
  268.                 ModelId[0] = 'M';
  269.                 ModelId[1] = 'L';
  270.                 ModelId[2] = 0x16;
  271.                 Len = 4;
  272.        
  273.           msg->FrameType = CAN_DATA_FRAME;
  274.     msg->IdType   = CAN_STD_ID;
  275.     msg->Id       = Device0_ISP_ID;
  276.     msg->DLC      = 0x7;
  277.     msg->Data[0]  = IX.Tag;       
  278.     msg->Data[1]  = Len;
  279.                 msg->Data[2]  =        IX.CmdID;
  280.                 msg->Data[3]  = ModelId[0];
  281.                 msg->Data[4]  = ModelId[1];
  282.                 msg->Data[5]  = ModelId[2];
  283.                 msg->Data[6]  = IX.CRC;
  284.        
  285.     CAN_Transmit(tCAN, MSG(0), msg);//Send CAN message
  286.                 CLK_SysTickDelay(10);   /* Generate the Delay Time by Systick */
  287. }

  288. void CAN_Response_Get_FW_Version(CAN_T *tCAN,STR_CANMSG_T *msg){
  289.                 uint8_t FW_Version[3];
  290.        
  291.                 //develop version : 0.0.1
  292.                 FW_Version[0] = 0;
  293.                 FW_Version[1] = 0;
  294.                 FW_Version[2] = 1;
  295.        
  296.           msg->FrameType = CAN_DATA_FRAME;
  297.     msg->IdType   = CAN_STD_ID;
  298.     msg->Id       = Device0_ISP_ID;
  299.     msg->DLC      = 0x4;
  300.     msg->Data[0]  = Get_FW_Version_Id        ;       
  301.     msg->Data[1]  = FW_Version[0];
  302.                 msg->Data[2]  = FW_Version[1];
  303.                 msg->Data[3]  = FW_Version[2];
  304.     CAN_Transmit(tCAN, MSG(0), msg);//Send CAN message
  305.                 CLK_SysTickDelay(10);   /* Generate the Delay Time by Systick */
  306. }

  307. void CAN_Set_LED_Steady(CAN_T *tCAN,uint16_t C_H,uint8_t Bitmap,uint8_t steady){
  308.           uint8_t CRC;
  309.                
  310.           msg1.FrameType = CAN_DATA_FRAME;
  311.     msg1.IdType   = CAN_STD_ID;
  312.     msg1.Id       = Device0_ISP_ID;
  313.     msg1.DLC      = 0x8;
  314.     msg1.Data[0]  = 0xFE        ;       
  315.     msg1.Data[1]  = 0x8;
  316.                 msg1.Data[2]  = 0x23;
  317.                 msg1.Data[3]  = C_H & 0xFF;
  318.                 msg1.Data[4]  = (C_H>>8) & 0xFF;
  319.                 msg1.Data[5]  = Bitmap;
  320.                 msg1.Data[6]  = steady;
  321.                 msg1.Data[7]  = CRC;
  322.                 CLK_SysTickDelay(3000);   /* Generate the Delay Time by Systick */
  323.     CAN_Transmit(tCAN, MSG(0), &msg1);//Send CAN message
  324. }

  325. void CAN_Set_LED_Blink(CAN_T *tCAN,uint16_t C_H,uint8_t Bitmap,uint8_t Interval_T,uint8_t Fadein_T,uint8_t Keep_T,uint8_t Fadeout_T){
  326.                 uint8_t CRC;
  327.                 /* Declare a CAN message structure */
  328.        
  329.           msg1.FrameType = CAN_DATA_FRAME;
  330.     msg1.IdType   = CAN_STD_ID;
  331.     msg1.Id       = Device0_ISP_ID;
  332.     msg1.DLC      = 0x8;
  333.     msg1.Data[0]  = 0xFE        ;       
  334.     msg1.Data[1]  = 0xB;
  335.                 msg1.Data[2]  = 0x22;
  336.                 msg1.Data[3]  =        C_H & 0xFF;
  337.                 msg1.Data[4]  = (C_H>>8) & 0xFF;
  338.                 msg1.Data[5]  = Bitmap;
  339.                 msg1.Data[6]  = Interval_T;
  340.                 msg1.Data[7]  = Fadein_T;
  341.                 CLK_SysTickDelay(3000);   /* Generate the Delay Time by Systick */
  342.     CAN_Transmit(tCAN, MSG(0), &msg1);//Send CAN message
  343.        
  344.           msg1.FrameType = CAN_DATA_FRAME;
  345.     msg1.IdType   = CAN_STD_ID;
  346.     msg1.Id       = Device0_ISP_ID;
  347.     msg1.DLC      = 0x3;
  348.     msg1.Data[0]  = Keep_T;       
  349.     msg1.Data[1]  = Fadeout_T;
  350.                 msg1.Data[2]  = CRC;
  351.                 CLK_SysTickDelay(3000);   /* Generate the Delay Time by Systick */
  352.     CAN_Transmit(tCAN, MSG(0), &msg1);//Send CAN message       
  353. }

  354. uint32_t reverse(uint32_t x){
  355.     x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
  356.     x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
  357.     x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
  358.     x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
  359.     return((x >> 16) | (x << 16));

  360. }

  361. Color_t HSVtoRGB(float H, float S,float V){
  362.     if(H>360 || H<0 || S>100 || S<0 || V>100 || V<0){
  363.         printf("The givem HSV values are not in valid range\n");
  364.                                 Color.valid = 0;
  365.         return Color;
  366.     }
  367.     float s = S/100;
  368.     float v = V/100;
  369.     float C = s*v;
  370.     float X = C*(1-fabs(fmod(H/60.0, 2)-1));
  371.     float m = v-C;
  372.     float r,g,b;
  373.     if(H >= 0 && H < 60){
  374.         r = C,g = X,b = 0;
  375.     }
  376.     else if(H >= 60 && H < 120){
  377.         r = X,g = C,b = 0;
  378.     }
  379.     else if(H >= 120 && H < 180){
  380.         r = 0,g = C,b = X;
  381.     }
  382.     else if(H >= 180 && H < 240){
  383.         r = 0,g = X,b = C;
  384.     }
  385.     else if(H >= 240 && H < 300){
  386.         r = X,g = 0,b = C;
  387.     }
  388.     else{
  389.         r = C,g = 0,b = X;
  390.     }
  391.     int R = (r+m)*255;
  392.     int G = (g+m)*255;
  393.     int B = (b+m)*255;
  394.     printf("R : %d",R);
  395.     printf("G : %d",G);
  396.     printf("B : %d",B);
  397.                 Color.R = R;
  398.                 Color.G = G;
  399.                 Color.B = B;
  400.                 Color.valid = 1;
  401.                 return Color;
  402. }


 楼主| xuanhuanzi 发表于 2022-12-20 15:08 | 显示全部楼层
  1. /****************************************************************************
  2. * @file     main.c
  3. * @version  V1.0
  4. * $Revision: 1 $
  5. * $Date: 05/12/22 10:30p $
  6. * @brief
  7. *           
  8. *           
  9. * @note
  10. * Copyright (C) 2022 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "NM1530.h"
  15. #include <string.h>
  16. #include <math.h>
  17. #include "system_initialize.h"

  18. #define CAN_BAUD_RATE                     500000
  19. #define Master_ISP_ID                     0xA2
  20. #define Device0_ISP_ID                    0xA3

  21. #define Get_Model_Id                                                                                        0x20
  22. #define Get_FW_Version_Id                                                                        0x21

  23. #define CLK_LED1                                                                                                        P33

  24. #define C_Frame_Length                                                                                4
  25. #define Frame_Start                                                                                                0
  26. #define Frame_LED_1                                                                                                1
  27. #define Frame_LED_2                                                                                                2
  28. #define Frame_End                                                                                                        3

  29. void Test_BasicMode_Tx(CAN_T  *tCAN);

  30. uint32_t unItem, BaudRate = 0, RealBaudRate = 0;
  31. uint8_t u8CAN_PackageFlag = 0, u8CAN_AckFlag = 0;

  32. typedef struct{
  33.         uint32_t bit0:1;
  34.         uint32_t bit1:1;
  35.         uint32_t bit2:1;
  36.         uint32_t bit3:1;
  37.         uint32_t bit4:1;
  38.         uint32_t bit5:1;
  39.         uint32_t bit6:1;
  40.         uint32_t bit7:1;
  41.         uint32_t bit8:1;
  42.         uint32_t bit9:1;
  43.         uint32_t bit10:1;
  44.         uint32_t bit11:1;
  45.         uint32_t bit12:1;
  46.         uint32_t bit13:1;
  47.         uint32_t bit14:1;
  48.         uint32_t bit15:1;
  49.         uint32_t bit16:1;
  50.         uint32_t bit17:1;
  51.         uint32_t bit18:1;
  52.         uint32_t bit19:1;
  53.         uint32_t bit20:1;
  54.         uint32_t bit21:1;
  55.         uint32_t bit22:1;
  56.         uint32_t bit23:1;
  57.         uint32_t bit24:1;
  58.         uint32_t bit25:1;
  59.         uint32_t bit26:1;
  60.         uint32_t bit27:1;
  61.         uint32_t bit28:1;
  62.         uint32_t bit29:1;
  63.         uint32_t bit30:1;
  64.         uint32_t bit31:1;
  65. }data_bit_t;

  66. typedef union {
  67.         uint32_t data_32;
  68.         data_bit_t data_bit;
  69. }serial_data_t;

  70. serial_data_t serial_data;

  71. typedef struct{
  72.         uint32_t mode;
  73.         uint32_t dim;
  74.         uint32_t blue;
  75.         uint32_t green;
  76.         uint32_t red;
  77. }LED_Frame_t;
  78. LED_Frame_t LED1_Frame[4];
  79. LED_Frame_t LED1_Frame_reverse[4];

  80. uint32_t record[3];

  81. typedef struct{
  82.         uint32_t R;
  83.         uint32_t G;
  84.         uint32_t B;
  85.         uint32_t valid;
  86. }Color_t;
  87. Color_t Color;

  88. typedef struct{
  89.         uint8_t Tag;
  90.         uint8_t CmdID;
  91.         uint8_t Length;
  92.         uint8_t Data[10];
  93.         uint8_t CRC;
  94. }IX_t;
  95. IX_t IX;
  96.        
  97. extern void CAN_Response_Get_Model_Id(CAN_T *tCAN,STR_CANMSG_T *msg);
  98. extern void CAN_Response_Get_FW_Version(CAN_T *tCAN,STR_CANMSG_T *msg);
  99. extern Color_t HSVtoRGB(float H, float S,float V);

  100. extern void CAN_Set_LED_Steady(CAN_T *tCAN,STR_CANMSG_T *msg,uint16_t C_H,uint8_t Bitmap,uint8_t steady);

  101. __align(4) STR_CANMSG_T rrMsg;
  102. STR_CANMSG_T tMsg;
  103. uint16_t test_on,Led_steady_on,input_C_H,input_Bitmap,input_steady;
  104. float C_H,C_S,C_V;

  105. void CAN_MsgInterrupt(CAN_T *tCAN, uint32_t u32IIDR)
  106. {
  107.     if(u32IIDR == 1)
  108.     {
  109.         CAN_Receive(tCAN, MSG(0), &rrMsg);
  110.         u8CAN_PackageFlag = 1;
  111.     }
  112. }
  113. uint16_t reset_can;
  114. void CAN_IRQHandler(void)
  115. {
  116.                 uint32_t u8IIDRstatus;
  117.                 u8IIDRstatus = CAN->IIDR;
  118.        
  119.   if(u8IIDRstatus == 0x00008000)        /* Check Status Interrupt Flag (Error status Int and Status change Int) */
  120.     {
  121.         /**************************/
  122.         /* Status Change interrupt*/
  123.         /**************************/
  124.         if(CAN->STATUS & CAN_STATUS_RXOK_Msk)
  125.         {
  126.             CAN->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/
  127.                                 }

  128.         if(CAN->STATUS & CAN_STATUS_TXOK_Msk)
  129.         {
  130.             CAN->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/
  131.             u8CAN_AckFlag = 0;
  132.         }
  133.                                 if(        CAN->STATUS & CAN_STATUS_BOFF_Msk){
  134.                                                 CAN->STATUS &= ~CAN_STATUS_BOFF_Msk;
  135.                                                 reset_can = 1;
  136.                                 }
  137.     }
  138.           else if((u8IIDRstatus >= 0x1) || (u8IIDRstatus <= 0x20))
  139.     {
  140.         CAN_MsgInterrupt(CAN, u8IIDRstatus);

  141.         CAN_CLR_INT_PENDING_BIT(CAN, (u8IIDRstatus - 1)); /* Clear Interrupt Pending */
  142.     }
  143. }

  144. uint16_t Data_Cnt;
  145. uint16_t Frame_Length,Frame_Cnt;
  146. uint16_t Set_LED1;

  147. void TMR0_IRQHandler(void){
  148.        
  149.         TIMER_ClearIntFlag(TIMER0);
  150.         if(Set_LED1){
  151.                 if(CLK_LED1 == 1){
  152.                         CLK_LED1 = 0;
  153.                        
  154.                         Frame_Length = C_Frame_Length;       
  155.                         if(Data_Cnt==0){
  156.                                 switch(Frame_Cnt){
  157.                                         case Frame_Start:
  158.                                                         serial_data.data_32 = 0;
  159.                                                         break;
  160.                                         case Frame_LED_1:
  161.                                                         LED1_Frame[0].mode = 0x7;
  162.                                                         LED1_Frame_reverse[0].mode =  reverse(LED1_Frame[0].mode);
  163.                                                         LED1_Frame_reverse[0].dim =  reverse(LED1_Frame[0].dim);
  164.                                                         LED1_Frame_reverse[0].blue =  reverse(LED1_Frame[0].blue);
  165.                                                         LED1_Frame_reverse[0].green =  reverse(LED1_Frame[0].green);
  166.                                                         LED1_Frame_reverse[0].red =  reverse(LED1_Frame[0].red);
  167.                                        
  168.                                                         serial_data.data_32 = ((LED1_Frame_reverse[0].mode>>29) & 0x7)|(((LED1_Frame_reverse[0].dim>>27) & 0x1F)<<3)|\
  169.                                                                                                                                                 (((LED1_Frame_reverse[0].blue>>24) & 0xFF)<<8)|(((LED1_Frame_reverse[0].green>>24) & 0xFF)<<16)|\
  170.                                                                                                                                                 (((LED1_Frame_reverse[0].red>>24) & 0xFF)<<24);
  171.                                                         record[0] = serial_data.data_32;
  172.                                                         break;
  173.                                         case Frame_LED_2:
  174.                                                         LED1_Frame[1].mode = 0x7;
  175.                                                         LED1_Frame_reverse[1].mode =  reverse(LED1_Frame[1].mode);
  176.                                                         LED1_Frame_reverse[1].dim =  reverse(LED1_Frame[1].dim);
  177.                                                         LED1_Frame_reverse[1].blue =  reverse(LED1_Frame[1].blue);
  178.                                                         LED1_Frame_reverse[1].green =  reverse(LED1_Frame[1].green);
  179.                                                         LED1_Frame_reverse[1].red =  reverse(LED1_Frame[1].red);
  180.                                        
  181.                                                         serial_data.data_32 = ((LED1_Frame_reverse[1].mode>>29) & 0x7)|(((LED1_Frame_reverse[1].dim>>27) & 0x1F)<<3)|\
  182.                                                                                                                                                 (((LED1_Frame_reverse[1].blue>>24) & 0xFF)<<8)|(((LED1_Frame_reverse[1].green>>24) & 0xFF)<<16)|\
  183.                                                                                                                                                 (((LED1_Frame_reverse[1].red>>24) & 0xFF)<<24);
  184.                                                         record[1] = serial_data.data_32;
  185.                                                         break;
  186.                                         case Frame_End:
  187.                                                         serial_data.data_32 = 0xFFFFFFFF;
  188.                                                         break;
  189.                                 }               
  190.                                 Frame_Cnt++;

  191.                         }
  192.                         P97 = (serial_data.data_32>>Data_Cnt) &0x1;
  193.                         Data_Cnt++;
  194.                         if(Data_Cnt>31){
  195.                                 Data_Cnt = 0;
  196.                                 if(Frame_Cnt>(Frame_Length-1)){
  197.                                         Frame_Cnt = 0;
  198.                                         //Set_LED1 = 0;
  199.                                 }
  200.                         }
  201.                 }else{
  202.                         CLK_LED1 = 1;
  203.                 }
  204.         }
  205. }
  206. /*---------------------------------------------------------------------------------------------------------*/
  207. /* MAIN function                                                                                           */
  208. /*---------------------------------------------------------------------------------------------------------*/
  209. int main(void)
  210. {       
  211.                 STR_CANMSG_T msg1;
  212.     /* Unlock protected registers */
  213.     SYS_UnlockReg();

  214.     /* Init System, IP clock */
  215.     SYS_Init_Clock();
  216.                 /* Init multi-function I/O */
  217.                 GPIO->PWMPOEN = 0;
  218.                 Initialize_GPIO();
  219.                
  220.                 /* Configure UART0 and set UART0 baud rate */
  221.     UART_Open(UART0, 115200);
  222.     /* Lock protected registers */
  223.     SYS_LockReg();

  224.                 printf("\n\nCPU @ %d Hz\n", SystemCoreClock);
  225.     printf("+------------------------------------------------+\n");
  226.        
  227.                 Initialize_Timer0();
  228.        
  229.     /*---------------------------------------------------------------------------------------------------------*/
  230.     /* SAMPLE CODE                                                                                             */
  231.     /*---------------------------------------------------------------------------------------------------------*/
  232.                
  233.                 BaudRate = CAN_BAUD_RATE ;
  234.     RealBaudRate = CAN_Open(CAN,  BaudRate, CAN_NORMAL_MODE);//Set target baud-rate and operation mode.
  235.                 /* Enable CAN interrupt */
  236.     CAN_EnableInt(CAN, (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk));
  237.     /* Set Interrupt Priority */
  238.     NVIC_SetPriority(CAN_IRQn, 0/*(1 << __NVIC_PRIO_BITS) - 2*/);
  239.     /* Enable External Interrupt */
  240.     NVIC_EnableIRQ(CAN_IRQn);
  241.                 /* Set CAN reveive message */
  242.     CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  243.                
  244.                 CLK_LED1 = 1;
  245.                
  246.     while(1){
  247.                         if(reset_can){
  248.                                 reset_can = 0;
  249.                                 RealBaudRate = CAN_Open(CAN,  BaudRate, CAN_NORMAL_MODE);//Set target baud-rate and operation mode.
  250.                                 /* Enable CAN interrupt */
  251.                                 CAN_EnableInt(CAN, (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk));
  252.                                 /* Set CAN reveive message */
  253.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  254.                         }       
  255.                         if(u8CAN_PackageFlag){
  256.                                 u8CAN_PackageFlag = 0;
  257.                                 IX.Tag = rrMsg.Data[0];
  258.                                 IX.CmdID = rrMsg.Data[2];
  259.                                 rrMsg.Data[0] = 0;
  260.                                 if(IX.Tag==0xFE){
  261.                                         switch(IX.CmdID){
  262.                                                 case Get_Model_Id:
  263.                                                                
  264.                                                                 CAN_Response_Get_Model_Id(CAN,&msg1);

  265.                                                         break;                       
  266.                                                 case Get_FW_Version_Id:
  267.                                                                
  268.                                                                 CAN_Response_Get_FW_Version(CAN,&msg1);
  269.                                                         break;       
  270.                                                 default:
  271.                                                        
  272.                                                         break;
  273.                                         }
  274.                                 }
  275.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  276.                         }
  277.                         if(test_on){
  278.                                 test_on = 0;
  279.                                 Test_BasicMode_Tx(CAN);
  280.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);
  281.                         }
  282.                         if(Led_steady_on){
  283.                                 Led_steady_on = 0;
  284.                                 CAN_Set_LED_Steady(CAN,&msg1,input_C_H,input_Bitmap,input_steady);
  285.                                 CAN_SetRxMsg(CAN, MSG(0), CAN_STD_ID, Master_ISP_ID);                       
  286.                         }
  287.                         Color = HSVtoRGB(C_H,C_S,C_V);       
  288.                 }
  289. }

  290. /*----------------------------------------------------------------------------*/
  291. /*  Send Tx Msg by Basic Mode Function (Without Message RAM)                  */
  292. /*----------------------------------------------------------------------------*/
  293. uint16_t CC_H;
  294. uint8_t Bitmap;
  295. uint8_t steady;
  296. void Test_BasicMode_Tx(CAN_T  *tCAN)
  297. {
  298.     int32_t delaycount;

  299.     /* Declare a CAN message structure */
  300.     STR_CANMSG_T msg1;
  301.     delaycount = 1000;

  302.     /* Send Message No.1 */
  303.     msg1.FrameType = CAN_DATA_FRAME;
  304.     msg1.IdType   = CAN_STD_ID;
  305.     msg1.Id       = Device0_ISP_ID;
  306.     msg1.DLC      = 8;
  307.     msg1.Data[0]  = 0xFE        ;       
  308.     msg1.Data[1]  = 0x8;
  309.                 msg1.Data[2]  = 0x23;
  310.                 msg1.Data[3]  = CC_H & 0xFF;
  311.                 msg1.Data[4]  = (CC_H>>8) & 0xFF;
  312.                 msg1.Data[5]  = Bitmap;
  313.                 msg1.Data[6]  = steady;
  314.                 msg1.Data[7]  = 0;

  315.     CAN_Transmit(tCAN, MSG(0), &msg1);//Send CAN message
  316.                 printf("Send STD_ID:0x1,Data[0,2]\n");
  317.     CLK_SysTickDelay(delaycount);   /* Generate the Delay Time by Systick */

  318. }

  319. void CAN_Response_Get_Model_Id(CAN_T *tCAN,STR_CANMSG_T *msg){
  320.                 uint8_t ModelId[3],Len;
  321.        
  322.                 ModelId[0] = 'M';
  323.                 ModelId[1] = 'L';
  324.                 ModelId[2] = 0x16;
  325.                 Len = 4;
  326.        
  327.           msg->FrameType = CAN_DATA_FRAME;
  328.     msg->IdType   = CAN_STD_ID;
  329.     msg->Id       = Device0_ISP_ID;
  330.     msg->DLC      = 0x7;
  331.     msg->Data[0]  = IX.Tag;       
  332.     msg->Data[1]  = Len;
  333.                 msg->Data[2]  =        IX.CmdID;
  334.                 msg->Data[3]  = ModelId[0];
  335.                 msg->Data[4]  = ModelId[1];
  336.                 msg->Data[5]  = ModelId[2];
  337.                 msg->Data[6]  = IX.CRC;
  338.        
  339.     CAN_Transmit(tCAN, MSG(0), msg);//Send CAN message
  340.                 CLK_SysTickDelay(10);   /* Generate the Delay Time by Systick */
  341. }

  342. void CAN_Response_Get_FW_Version(CAN_T *tCAN,STR_CANMSG_T *msg){
  343.                 uint8_t FW_Version[3];
  344.        
  345.                 //develop version : 0.0.1
  346.                 FW_Version[0] = 0;
  347.                 FW_Version[1] = 0;
  348.                 FW_Version[2] = 1;
  349.        
  350.           msg->FrameType = CAN_DATA_FRAME;
  351.     msg->IdType   = CAN_STD_ID;
  352.     msg->Id       = Device0_ISP_ID;
  353.     msg->DLC      = 0x4;
  354.     msg->Data[0]  = Get_FW_Version_Id        ;       
  355.     msg->Data[1]  = FW_Version[0];
  356.                 msg->Data[2]  = FW_Version[1];
  357.                 msg->Data[3]  = FW_Version[2];
  358.     CAN_Transmit(tCAN, 0, msg);//Send CAN message
  359.                 CLK_SysTickDelay(10);   /* Generate the Delay Time by Systick */
  360. }

  361. void CAN_Set_LED_Steady(CAN_T *tCAN,STR_CANMSG_T *msg,uint16_t C_H,uint8_t Bitmap,uint8_t steady){
  362.        
  363.           msg->FrameType = CAN_DATA_FRAME;
  364.     msg->IdType   = CAN_STD_ID;
  365.     msg->Id       = Device0_ISP_ID;
  366.     msg->DLC      = 0x8;
  367.     msg->Data[0]  = 0xFE        ;       
  368.     msg->Data[1]  = 0x8;
  369.                 msg->Data[2]  = 0x23;
  370.                 msg->Data[3]  = C_H & 0xFF;
  371.                 msg->Data[4]  = (C_H>>8) & 0xFF;
  372.                 msg->Data[5]  = Bitmap;
  373.                 msg->Data[6]  = steady;
  374.                 msg->Data[7]  = 0;
  375.     CAN_Transmit(tCAN, MSG(0), msg);//Send CAN message
  376.                 CLK_SysTickDelay(10);   /* Generate the Delay Time by Systick */
  377. }

  378. uint32_t reverse(uint32_t x){
  379.     x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
  380.     x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
  381.     x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
  382.     x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
  383.     return((x >> 16) | (x << 16));

  384. }

  385. Color_t HSVtoRGB(float H, float S,float V){
  386.     if(H>360 || H<0 || S>100 || S<0 || V>100 || V<0){
  387.         printf("The givem HSV values are not in valid range\n");
  388.                                 Color.valid = 0;
  389.         return Color;
  390.     }
  391.     float s = S/100;
  392.     float v = V/100;
  393.     float C = s*v;
  394.     float X = C*(1-fabs(fmod(H/60.0, 2)-1));
  395.     float m = v-C;
  396.     float r,g,b;
  397.     if(H >= 0 && H < 60){
  398.         r = C,g = X,b = 0;
  399.     }
  400.     else if(H >= 60 && H < 120){
  401.         r = X,g = C,b = 0;
  402.     }
  403.     else if(H >= 120 && H < 180){
  404.         r = 0,g = C,b = X;
  405.     }
  406.     else if(H >= 180 && H < 240){
  407.         r = 0,g = X,b = C;
  408.     }
  409.     else if(H >= 240 && H < 300){
  410.         r = X,g = 0,b = C;
  411.     }
  412.     else{
  413.         r = C,g = 0,b = X;
  414.     }
  415.     int R = (r+m)*255;
  416.     int G = (g+m)*255;
  417.     int B = (b+m)*255;
  418.     printf("R : %d",R);
  419.     printf("G : %d",G);
  420.     printf("B : %d",B);
  421.                 Color.R = R;
  422.                 Color.G = G;
  423.                 Color.B = B;
  424.                 Color.valid = 1;
  425.                 return Color;
  426. }
zhuomuniao110 发表于 2022-12-20 15:11 | 显示全部楼层
这个例子需要扎实的C基本功啊。有结构体,位段,联合体。。。
小小蚂蚁举千斤 发表于 2022-12-30 21:27 | 显示全部楼层
CAN总线通讯在工业应用比较多,主要是速率快,稳定性好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部