久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1016|回復: 2
打印 上一主題 下一主題
收起左側

關于stc32g12k128-beta單片機自帶can的ID過濾配置

[復制鏈接]
跳轉到指定樓層
樓主
ID:1111967 發表于 2024-9-19 09:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我最近剛接觸stc32g系列單片機,聽說這個單片機自帶兩個can口很方便,發的程序我試過了,通過外接一個收發器和官方給的例程可以精準的進行can的發送。但是我試了下濾單個id就是解決不了,請教一下大家該如何配置總線驗收寄存器。我需要過濾單個id為10040901報文
  1. #include"STC32G.h"
  2. #include "intrins.h"

  3. typedef         unsigned char        u8;
  4. typedef         unsigned int        u16;
  5. typedef         unsigned long        u32;

  6. #define MAIN_Fosc        24000000UL

  7. /****************************** 用戶定義宏 ***********************************/
  8. //CAN總線波特率=Fclk/((1+(TSG1+1)+(TSG2+1))*(BRP+1)*2)
  9. #define TSG1    2                //0~15
  10. #define TSG2    1                //1~7 (TSG2 不能設置為0)
  11. #define BRP     3                //0~63
  12. //24000000/((1+3+2)*4*2)=500KHz

  13. #define SJW     1                //重新同步跳躍寬度

  14. //總線波特率100KHz以上設置為 0; 100KHz以下設置為 1
  15. #define SAM     0                //總線電平采樣次數: 0:采樣1次; 1:采樣3次

  16. /*****************************************************************************/


  17. /*************  本地常量聲明    **************/

  18. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中斷頻率, 1000次/秒

  19. #define        STANDARD_FRAME   0     //幀格式:標準幀
  20. #define        EXTENDED_FRAME   1     //幀格式:擴展幀

  21. /*************  本地變量聲明    **************/

  22. typedef struct
  23. {
  24.         u8        DLC:4;          //數據長度, bit0~bit3
  25.         u8        :2;             //空數據, bit4~bit5
  26.         u8        RTR:1;          //幀類型, bit6
  27.         u8        FF:1;           //幀格式, bit7
  28.         u32        ID;             //CAN ID
  29.         u8        DataBuffer[8];  //數據緩存
  30. }CAN_DataDef;

  31. CAN_DataDef CAN1_Tx;
  32. CAN_DataDef CAN1_Rx[8];

  33. bit B_CanRead;      //CAN 收到數據標志
  34. bit B_1ms;          //1ms標志
  35. u16 msecond;

  36. /*************  本地函數聲明    **************/
  37. void CANInit();
  38. u8 CanReadReg(u8 addr);
  39. u8 CanReadMsg(CAN_DataDef *CAN);
  40. void CanSendMsg(CAN_DataDef *CAN);

  41. void Delay1000ms(void)        //@24.000MHz
  42. {
  43.         unsigned long edata i;

  44.         _nop_();
  45.         _nop_();
  46.         i = 5999998UL;
  47.         while (i) i--;
  48. }

  49. /********************* 主函數 *************************/
  50. void main(void)
  51. {
  52.         u8 sr,i,n;
  53.                

  54.     WTST = 0;  //設置程序指令延時參數,賦值為0可將CPU執行指令的速度設置為最快
  55.     EAXFR = 1; //擴展寄存器(XFR)訪問使能
  56.     CKCON = 0; //提高訪問XRAM速度

  57.     P0M1 = 0x30;   P0M0 = 0x30;   //設置P0.4、P0.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  58.     P1M1 = 0x32;   P1M0 = 0x32;   //設置P1.1、P1.4、P1.5為漏極開路(實驗箱加了上拉電阻到3.3V), P1.1在PWM當DAC電路通過電阻串聯到P2.3
  59.     P2M1 = 0x3c;   P2M0 = 0x3c;   //設置P2.2~P2.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  60.     P3M1 = 0x50;   P3M0 = 0x50;   //設置P3.4、P3.6為漏極開路(實驗箱加了上拉電阻到3.3V)
  61.     P4M1 = 0x3c;   P4M0 = 0x3c;   //設置P4.2~P4.5為漏極開路(實驗箱加了上拉電阻到3.3V)
  62.     P5M1 = 0x0c;   P5M0 = 0x0c;   //設置P5.2、P5.3為漏極開路(實驗箱加了上拉電阻到3.3V)
  63.     P6M1 = 0xff;   P6M0 = 0xff;   //設置為漏極開路(實驗箱加了上拉電阻到3.3V)
  64.     P7M1 = 0x00;   P7M0 = 0x00;   //設置為準雙向口

  65.         AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  66.         TH0 = (u8)(Timer0_Reload / 256);
  67.         TL0 = (u8)(Timer0_Reload % 256);
  68.         ET0 = 1;    //Timer0 interrupt enable
  69.         TR0 = 1;    //Tiner0 run

  70.         CANInit();
  71.         
  72.         EA = 1;                 //打開總中斷

  73.         CAN1_Tx.FF = EXTENDED_FRAME;    //擴展幀
  74.         CAN1_Tx.RTR = 0;                //0:數據幀,1:遠程幀
  75.         CAN1_Tx.DLC = 0x08;             //數據長度
  76.         CAN1_Tx.ID = 0x11040109;        //CAN ID
  77.         CAN1_Tx.DataBuffer[0] = 0x00;   //數據內容
  78.         CAN1_Tx.DataBuffer[1] = 0x00;
  79.         CAN1_Tx.DataBuffer[2] = 0x30;
  80.         CAN1_Tx.DataBuffer[3] = 0x00;
  81.         CAN1_Tx.DataBuffer[4] = 0x00;
  82.         CAN1_Tx.DataBuffer[5] = 0x00;
  83.         CAN1_Tx.DataBuffer[6] = 0x80;
  84.         CAN1_Tx.DataBuffer[7] = 0x00;
  85.                 P54 = 0;
  86.         Delay1000ms();
  87.         P54 = 1;
  88.         while(1)
  89.         {
  90.                 if(B_1ms)   //1ms到
  91.                 {
  92.                         B_1ms = 0;
  93.                         if(++msecond >= 1000)   //1秒到
  94.                         {
  95.                                 msecond = 0;
  96.                                 sr = CanReadReg(SR);

  97.                                 if(sr & 0x01)                //判斷是否有 BS:BUS-OFF狀態
  98.                                 {
  99.                                         CANAR = MR;
  100.                                         CANDR &= ~0x04;  //清除 Reset Mode, 從BUS-OFF狀態退出
  101.                                 }
  102.                                 else
  103.                                 {
  104.                     CanSendMsg(&CAN1_Tx);   //發送一幀數據
  105.                                 }
  106.                         }
  107.                 }

  108.                 if(B_CanRead)
  109.                 {
  110.                         B_CanRead = 0;
  111.                         
  112.             n = CanReadMsg(CAN1_Rx);    //讀取接收內容
  113.             if(n>0)
  114.             {
  115.                 for(i=0;i<n;i++)
  116.                 {
  117.                     CanSendMsg(&CAN1_Rx[i]);  //CAN總線原樣返回
  118.                 }
  119.             }
  120.                 }
  121.         }
  122. }


  123. /********************** Timer0 1ms中斷函數 ************************/
  124. void timer0 (void) interrupt 1
  125. {
  126.     B_1ms = 1;      //1ms標志
  127. }

  128. //========================================================================
  129. // 函數: u8 ReadReg(u8 addr)
  130. // 描述: CAN功能寄存器讀取函數。
  131. // 參數: CAN功能寄存器地址.
  132. // 返回: CAN功能寄存器數據.
  133. // 版本: VER1.0
  134. // 日期: 2020-11-16
  135. // 備注:
  136. //========================================================================
  137. u8 CanReadReg(u8 addr)
  138. {
  139.         u8 dat;
  140.         CANAR = addr;
  141.         dat = CANDR;
  142.         return dat;
  143. }

  144. //========================================================================
  145. // 函數: void WriteReg(u8 addr, u8 dat)
  146. // 描述: CAN功能寄存器配置函數。
  147. // 參數: CAN功能寄存器地址, CAN功能寄存器數據.
  148. // 返回: none.
  149. // 版本: VER1.0
  150. // 日期: 2020-11-16
  151. // 備注:
  152. //========================================================================
  153. void CanWriteReg(u8 addr, u8 dat)
  154. {
  155.         CANAR = addr;
  156.         CANDR = dat;
  157. }

  158. //========================================================================
  159. // 函數: void CanReadFifo(CAN_DataDef *CANx)
  160. // 描述: 讀取CAN緩沖區數據函數。
  161. // 參數: *CANx: 存放CAN總線讀取數據.
  162. // 返回: none.
  163. // 版本: VER2.0
  164. // 日期: 2023-01-31
  165. // 備注:
  166. //========================================================================
  167. void CanReadFifo(CAN_DataDef *CAN)
  168. {
  169.     u8 i;
  170.     u8 pdat[5];
  171.     u8 RX_Index=0;

  172.     pdat[0] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));

  173.     if(pdat[0] & 0x80)  //判斷是標準幀還是擴展幀
  174.     {
  175.         pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));   //擴展幀ID占4個字節
  176.         pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
  177.         pdat[3] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
  178.         pdat[4] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
  179.         CAN->ID = (((u32)pdat[1] << 24) + ((u32)pdat[2] << 16) + ((u32)pdat[3] << 8) + pdat[4]) >> 3;
  180.     }
  181.     else
  182.     {
  183.         pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));   //標準幀ID占2個字節
  184.         pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
  185.         CAN->ID = ((pdat[1] << 8) + pdat[2]) >> 5;
  186.     }

  187.     CAN->FF = pdat[0] >> 7;     //幀格式
  188.     CAN->RTR = pdat[0] >> 6;    //幀類型
  189.     CAN->DLC = pdat[0];         //數據長度

  190.     for(i=0;((i<CAN->DLC) && (i<8));i++)        //讀取數據長度為len,最多不超過8
  191.     {
  192.         CAN->DataBuffer[i] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));   //讀取有效數據
  193.     }
  194.     while(RX_Index&3)   //判斷已讀數據長度是否4的整數倍
  195.     {
  196.         CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));  //讀取填充數據,一幀數據占據4的整數倍緩沖區空間,不足補0
  197.     }
  198. }

  199. //========================================================================
  200. // 函數: u8 CanReadMsg(void)
  201. // 描述: CAN接收數據函數。
  202. // 參數: *CANx: 存放CAN總線讀取數據..
  203. // 返回: 幀個數.
  204. // 版本: VER2.0
  205. // 日期: 2023-01-31
  206. // 備注:
  207. //========================================================================
  208. u8 CanReadMsg(CAN_DataDef *CAN)
  209. {
  210.     u8 i;
  211.     u8 n=0;

  212.     do{
  213.         CanReadFifo(&CAN[n++]);  //讀取接收緩沖區數據
  214.         i = CanReadReg(SR);
  215.     }while(i&0x80);     //判斷接收緩沖區里是否還有數據,有的話繼續讀取

  216.     return n;   //返回幀個數
  217. }

  218. //========================================================================
  219. // 函數: void CanSendMsg(CAN_DataDef *CAN)
  220. // 描述: CAN發送標準幀函數。
  221. // 參數: *CANx: 存放CAN總線發送數據..
  222. // 返回: none.
  223. // 版本: VER1.0
  224. // 日期: 2020-11-19
  225. // 備注:
  226. //========================================================================
  227. void CanSendMsg(CAN_DataDef *CAN)
  228. {
  229.         u32 CanID;
  230.     u8 RX_Index,i;

  231.     if(CAN->FF)     //判斷是否擴展幀
  232.     {
  233.         CanID = CAN->ID << 3;
  234.         CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)|0x80);        //bit7: 標準幀(0)/擴展幀(1), bit6: 數據幀(0)/遠程幀(1), bit3~bit0: 數據長度(DLC)
  235.         CanWriteReg(TX_BUF1,(u8)(CanID>>24));
  236.         CanWriteReg(TX_BUF2,(u8)(CanID>>16));
  237.         CanWriteReg(TX_BUF3,(u8)(CanID>>8));

  238.         CanWriteReg(TX_BUF0,(u8)CanID);

  239.         RX_Index = 1;
  240.         for(i=0;((i<CAN->DLC) && (i<8));i++)        //數據長度為DLC,最多不超過8
  241.         {
  242.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer[i]);   //寫入有效數據
  243.         }
  244.         while(RX_Index&3)   //判斷已讀數據長度是否4的整數倍
  245.         {
  246.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //寫入填充數據,一幀數據占據4的整數倍緩沖區空間,不足補0
  247.         }
  248.     }
  249.     else    //發送標準幀
  250.     {
  251.         CanID = (u16)(CAN->ID << 5);
  252.         CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6));  //bit7: 標準幀(0)/擴展幀(1), bit6: 數據幀(0)/遠程幀(1), bit3~bit0: 數據長度(DLC)
  253.         CanWriteReg(TX_BUF1,(u8)(CanID>>8));
  254.         CanWriteReg(TX_BUF2,(u8)CanID);

  255.         RX_Index = 3;
  256.         for(i=0;((i<CAN->DLC) && (i<8));i++)        //數據長度為DLC,最多不超過8
  257.         {
  258.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer[i]);   //寫入有效數據
  259.         }
  260.         while(RX_Index&3)   //判斷已讀數據長度是否4的整數倍
  261.         {
  262.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //寫入填充數據,一幀數據占據4的整數倍緩沖區空間,不足補0
  263.         }
  264.     }
  265.         CanWriteReg(CMR ,0x04);                //發起一次幀傳輸
  266. }

  267. //========================================================================
  268. // 函數: void CANSetBaudrate()
  269. // 描述: CAN總線波特率設置函數。
  270. // 參數: none.
  271. // 返回: none.
  272. // 版本: VER1.0
  273. // 日期: 2020-11-19
  274. // 備注:
  275. //========================================================================
  276. void CANSetBaudrate()
  277. {
  278.         CanWriteReg(BTR0,(SJW << 6) + BRP);
  279.         CanWriteReg(BTR1,(SAM << 7) + (TSG2 << 4) + TSG1);
  280. }

  281. //========================================================================
  282. // 函數: void CANInit()
  283. // 描述: CAN初始化函數。
  284. // 參數: none.
  285. // 返回: none.
  286. // 版本: VER1.0
  287. // 日期: 2020-11-19
  288. // 備注:
  289. //========================================================================
  290. void CANInit()
  291. {
  292.         CANEN = 1;          //CAN1模塊使能
  293.         CanWriteReg(MR  ,0x05);  //使能 Reset Mode, 采用單濾波設置

  294.         CANSetBaudrate();        //設置波特率
  295.         
  296.         //設置過濾ID為:xxF8xxxx 的幀才接收
  297.         CanWriteReg(ACR0,0x80);                //總線驗收代碼寄存器
  298.         CanWriteReg(ACR1,0x20);
  299.         CanWriteReg(ACR2,0x48);
  300.         CanWriteReg(ACR3,0x08);
  301.         CanWriteReg(AMR0,0x80);                //總線驗收屏蔽寄存器
  302.         CanWriteReg(AMR1,0x20);
  303.         CanWriteReg(AMR2,0x48);
  304.         CanWriteReg(AMR3,0x08);

  305.         //取消過濾ID,所有幀都接收
  306. //        CanWriteReg(ACR0,0x00);                //總線驗收代碼寄存器
  307. //        CanWriteReg(ACR1,0x00);
  308. //        CanWriteReg(ACR2,0x00);
  309. //        CanWriteReg(ACR3,0x00);
  310. //        CanWriteReg(AMR0,0xFF);                //總線驗收屏蔽寄存器
  311. //        CanWriteReg(AMR1,0xFF);
  312. //        CanWriteReg(AMR2,0xFF);
  313. //        CanWriteReg(AMR3,0xFF);

  314.         CanWriteReg(IMR ,0xff);                //中斷寄存器
  315.         CanWriteReg(ISR ,0xff);                //清中斷標志
  316.         CanWriteReg(MR  ,0x01);                //退出 Reset Mode, 采用單濾波設置(設置過濾器后注意選擇濾波模式)
  317. //        CanWriteReg(MR  ,0x00);                //退出 Reset Mode, 采用雙濾波設置(設置過濾器后注意選擇濾波模式)

  318.         P_SW1 = (P_SW1 & ~(3<<4)) | (0<<4); //端口切換(CAN_Rx,CAN_Tx) 0x00:P0.0,P0.1  0x10:P5.0,P5.1  0x20:P4.2,P4.5  0x30:P7.0,P7.1
  319.         CANICR = 0x02;                //CAN中斷使能
  320. }

  321. //========================================================================
  322. // 函數: void CANBUS_Interrupt(void) interrupt CAN1_VECTOR
  323. // 描述: CAN總線中斷函數。
  324. // 參數: none.
  325. // 返回: none.
  326. // 版本: VER1.0
  327. // 日期: 2020-11-19
  328. // 備注:
  329. //========================================================================
  330. void CANBUS_Interrupt(void) interrupt CAN1_VECTOR
  331. {
  332.         u8 isr;
  333.         u8 arTemp;
  334.         arTemp = CANAR;     //CANAR現場保存,避免主循環里寫完 CANAR 后產生中斷,在中斷里修改了 CANAR 內容
  335.         
  336.         isr = CanReadReg(ISR);
  337.         if((isr & 0x04) == 0x04)  //TI
  338.     {
  339.                 CANAR = ISR;
  340.                 CANDR = 0x04;    //CLR FLAG
  341.     }        
  342.         if((isr & 0x08) == 0x08)  //RI
  343.     {
  344.                 CANAR = ISR;
  345.                 CANDR = 0x08;    //CLR FLAG
  346.         
  347.                 B_CanRead = 1;
  348.     }

  349.         if((isr & 0x40) == 0x40)  //ALI
  350.     {
  351.                 CANAR = ISR;
  352.                 CANDR = 0x40;    //CLR FLAG
  353.     }        

  354.         if((isr & 0x20) == 0x20)  //EWI
  355.     {
  356.                 CANAR = ISR;
  357.                 CANDR = 0x20;    //CLR FLAG
  358.     }        

  359.         if((isr & 0x10) == 0x10)  //EPI
  360.     {
  361.                 CANAR = ISR;
  362.                 CANDR = 0x10;    //CLR FLAG
  363.     }        

  364.         if((isr & 0x02) == 0x02)  //BEI
  365.     {
  366.                 CANAR = ISR;
  367.                 CANDR = 0x02;    //CLR FLAG
  368.     }        

  369.         if((isr & 0x01) == 0x01)  //DOI
  370.     {
  371.                 CANAR = ISR;
  372.                 CANDR = 0x01;    //CLR FLAG
  373.     }        

  374.         CANAR = arTemp;    //CANAR現場恢復
  375. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:314246 發表于 2024-9-19 11:57 | 只看該作者
手冊上有說明,這個是可以過濾的,我用過

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:1111967 發表于 2024-9-20 09:15 | 只看該作者
lrkeji1982 發表于 2024-9-19 11:57
手冊上有說明,這個是可以過濾的,我用過

精準的過濾一個很難算,我找到了一個軟件可以直接算出來,謝謝回復
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av黄色在线 | 男人的天堂视频网站 | 亚洲性视频网站 | 久久午夜视频 | 一级a性色生活片久久毛片波多野 | 日韩精品一区二区三区中文字幕 | 欧美精品一二三 | 亚洲专区在线 | 亚洲视频区 | 国产成人免费网站 | 亚洲视频在线免费观看 | 国产精品区一区二 | 9999国产精品欧美久久久久久 | 免费在线一区二区三区 | av网站观看 | 自拍偷拍亚洲欧美 | 久久精品视频免费观看 | 亚洲视频 欧美视频 | 亚洲一区视频 | 日韩免费av | 天天拍天天色 | 91国内外精品自在线播放 | av毛片| av中文字幕网站 | 欧美在线播放一区 | 成人亚洲性情网站www在线观看 | 国产99久久精品一区二区永久免费 | 免费艹逼视频 | 久久这里只有精品首页 | 超碰免费在线 | 日韩精品在线看 | 一级毛片视频 | 午夜爱爱网 | 综合久久久 | 久久成人免费 | 国产精品久久久久久久久久久久久久 | 一个色在线 | 亚洲一二三区在线观看 | 91网视频| 欧美视频一区二区三区 | 国产精品1区2区3区 国产在线观看一区 |