首頁 > 評測 > 【AutoChips 7801x MCU評測報告】+CAN測試

【AutoChips 7801x MCU評測報告】+CAN測試

  
  • 作者:
  • 來源:
  • [導(dǎo)讀]
  • 本帖最后由 full_stack 于 2020-7-10 22:36 編輯 AC7801x 開發(fā)板,MCU型號為 AC78013FDLA,LQFP48 收到開發(fā)板就準(zhǔn)備測試, 開發(fā)環(huán)境: Keil MDK Version 5 AutoChips.AC780x_DFP.1.0.1.pack 硬件方面要

本帖最后由 full_stack 于 2020-7-10 22:36 編輯

AC7801x 開發(fā)板,MCU型號為 AC78013FDLA,LQFP48
收到開發(fā)板就準(zhǔn)備測試,
開發(fā)環(huán)境:
Keil MDK Version 5
AutoChips.AC780x_DFP.1.0.1.pack

硬件方面要有:
12V/5V 電源
下載仿真器
電源接口我找了下,沒找到跟板子對應(yīng)的,
下載器J-Link使用20針牛角座連上不能識別出設(shè)備。
擱置了幾天,當(dāng)時也比較忙,



昨天又拿出來,
電源用了12V的開關(guān)電源,焊了兩根線到背面,
下載器用了DAP飛線到板子上,總算能下載運行了,

打開Keil MDK Version 5,打開Pack Installer,如圖



可以看到AC78013FDLA提供的例程是如此之多,
隨便選幾個例程復(fù)制到本地測試,我選擇CAN和GPIO的例程,因為考慮到會用這款芯片CAN設(shè)備的開發(fā)。

  1. while (1)
  2.     {
  3.                                 /* Get KEY6 state and Set LED2 state */
  4.         if ((s_key6State == GPIO_KEY_RELEASE) && (GPIO_GET_KEY6() == GPIO_KEY_PRESS))  /* Is KEY6 had been pressed */
  5.         {
  6.             mdelay(10);
  7.             if (GPIO_GET_KEY6() == GPIO_KEY_PRESS)
  8.             {
  9.                 s_led2Enable = !s_led2Enable;
  10.                 GPIO_SET_LED2(s_led2Enable);  /* toggle LED2 output */
  11.                 if (s_key6State == GPIO_KEY_RELEASE)
  12.                 {
  13.                     s_key6State = GPIO_KEY_PRESS;
  14.                     printf("KEY6 press!\r\n");
  15.                 }
  16.                                                                 recvFrameCount += CAN_InterruptRecvSendTest(CANx, type);
  17.             }
  18.         }
  19.                                 else if ((s_key6State == GPIO_KEY_PRESS) && (GPIO_GET_KEY6() == GPIO_KEY_RELEASE)) /* Is KEY6 had been released */
  20.         {
  21.             s_key6State = GPIO_KEY_RELEASE;
  22.             printf("KEY6 release!\r\n");
  23.         }
  24.         else
  25.         {
  26.  
  27.         }
  28.  
  29.         /* Get KEY7 state and Set LED3 state */
  30.         if ((s_key7State == GPIO_KEY_RELEASE) && (GPIO_GET_KEY7() == GPIO_KEY_PRESS))  /* Is KEY7 had been pressed */
  31.         {
  32.             mdelay(10);
  33.             if (GPIO_GET_KEY7() == GPIO_KEY_PRESS)
  34.             {
  35.                 s_key7State = GPIO_KEY_PRESS;
  36.                 s_led3Enable = !s_led3Enable;
  37.                 GPIO_SET_LED3(s_led3Enable);  /* toggle LED3 output */
  38.                 printf("KEY7 press!\r\n");
  39.             }
  40.         }
  41.         else if ((s_key7State == GPIO_KEY_PRESS) && (GPIO_GET_KEY7() == GPIO_KEY_RELEASE))  /* Is KEY6 had been released */
  42.         {
  43.             s_key7State = GPIO_KEY_RELEASE;
  44.             printf("KEY7 release!\r\n");
  45.         }
  46.         else
  47.         {
  48.  
  49.         }
  50.     }
復(fù)制代碼


例程選擇的CAN_DEMO,主函數(shù)用的的GPIO例程,按鍵KEY6控制LED2燈的時候發(fā)送一幀CAN,



CAN_DEMO中由于本來是設(shè)置了一段發(fā)送邏輯,由主程序500ms發(fā)送一次,所以會出現(xiàn)遠(yuǎn)程幀仍有數(shù)據(jù)長度的識別,

  1. int32_t CAN_InterruptRecvSendTest(CAN_Type *CANx, CAN_TransmitBufferType type)
  2. {
  3.     static CAN_MsgInfoType s_sendMsg = {0};
  4.     static uint8_t sendData[8] = {0};
  5.     int32_t recv = 0;
  6.     uint8_t instance = 0;
  7.  
  8.     instance = CAN_INDEX(CANx);
  9.  
  10.     if (s_recvMsgPool[instance].recvCount > 0)
  11.     {
  12.         while (s_recvMsgPool[instance].recvCount > 0)
  13.         {
  14.             recv++;
  15.             HandlePoolCanMsg(CANx);
  16.         }
  17.     }
  18.     if (!CAN_IsTransmitBusy(CANx, type))
  19.     {
  20.         s_sendMsg.ID++;
  21.         s_sendMsg.IDE = rand() % 2;
  22.         s_sendMsg.RTR = rand() % 2;
  23.         s_sendMsg.DLC = rand() % 9;
  24.         *(uint32_t *)sendData += 0xf;
  25.         *((uint32_t *)sendData + 1) += 0xf;
  26.         s_sendMsg.DATA = sendData;
  27.         if (0 == CAN_TransmitMessage(CANx, &s_sendMsg, type))
  28.         {
  29.             g_sendCount[instance]++;
  30.         }
  31.     }
  32.  
  33.     return recv;
  34. }
復(fù)制代碼


不知是接收器檢測到RTR位為遠(yuǎn)程幀,后面的數(shù)據(jù)部分不接收,還是遠(yuǎn)程幀沒有發(fā)送8字節(jié)數(shù)據(jù)。
照我的理解,
如果發(fā)送遠(yuǎn)程幀,那么表示數(shù)據(jù)長度的寄存器DLC應(yīng)該是0,并且不應(yīng)該有8字節(jié)的數(shù)據(jù)發(fā)送
如果發(fā)送數(shù)據(jù)幀,不足八字節(jié),那么DLC是幾就應(yīng)該發(fā)送幾個字節(jié),
不應(yīng)該一直發(fā)8字節(jié),由接收器去自己抉擇。

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評論

  • 聯(lián)系人:巧克力娃娃
  • 郵箱:board@21ic.com
  • 我要投稿
  • 歡迎入駐,開放投稿

熱門標(biāo)簽
項目外包 more+