日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CAN通信机制

發(fā)布時(shí)間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CAN通信机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.CAN通信是實(shí)現(xiàn)不同目標(biāo)板之間的通信,因此需要相同的時(shí)鐘頻率。因此需要進(jìn)行時(shí)鐘配置,一般在configPll中進(jìn)行配置。進(jìn)行倍頻,分頻處理等,得到合適的波特率。

2.CAN通信流程:

CAN_INIT();

對(duì)CAN進(jìn)行初始化配置,包括模式,中斷等,一般為接收中斷。

? ? ? CAN_Exception();

CAN中斷處理,接收中斷,按照CAN的幀傳輸方式接收數(shù)據(jù)。

void CAN2_Exception(void)
{

??CAN2ICR &= ~0x0001;

? ?OS_ENTER_CRITICAL();
? ? pDest = (uint32 *)&MsgBuf_RX2[CanFrameCount];

? ?*pDest = CAN2RFS; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Frame

? ? pDest++;
? ? *pDest = CAN2RID; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // ID

? ? pDest++;
? ? *pDest = CAN2RDA; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // Data A

? ? pDest++;
? ? *pDest = CAN2RDB; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // Data B

? ? CAN2CMR = 0x04; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
??
VICVectAddr = 0;
OS_EXIT_CRITICAL();

}

3.CAN接收濾波器特性:

分為三種:關(guān)閉模式,旁路模式,工作模式和FullCAN模式。

一般使用旁路模式,即廣播模式。

CAN 模式選擇函數(shù):

void CAN_SetACCF( uint32 ACCFMode )
{
? ? switch ( ACCFMode )
? ? {
? ?case ACCF_OFF:
? ? ? ?CAN_AFMR = ACCFMode;
? ? ? ?CAN1MOD = CAN2MOD = 1; // Reset CAN
? ? ? ?CAN1IER = CAN2IER = 0; // Disable Receive Interrupt
? ? ? ?CAN1GSR = CAN2GSR = 0; // Reset error counter when CANxMOD is in reset
? ?break;
? ?case ACCF_BYPASS:
? ? ? ?CAN_AFMR = ACCFMode;
? ?break;

? ?case ACCF_ON:
? ?case ACCF_FULLCAN:
? ? ? ?CAN_AFMR = ACCF_OFF;
? ? ? ?CAN_SetACCF_Lookup(); ?//Fu'llCAN模式,由驗(yàn)收濾波器來(lái)訪問(wèn),硬件驗(yàn)收過(guò)濾。需要進(jìn)行ID查找。
? ? ? ?CAN_AFMR = ACCFMode;
? ? ? ?break;
? ?default:
? ? ? ?break;
? }
? return;
}

Fu'llCAN模式下,ID的查找函數(shù):

void CAN_SetACCF_Lookup( void )
{
? ? uint32 address = 0;
? ? uint32 i;
? ? uint32 ID_high, ID_low;

? ? // Set explicit standard Frame
? ? CAN_SFF_SA = address;
? ? for ( i = 0; i < ACCF_IDEN_NUM; i += 2 )
? ? {
? ?ID_low = (i << 29) | (EXP_STD_ID << 16);
? ?ID_high = ((i+1) << 13) | (EXP_STD_ID << 0);
? ?*((volatile uint32 *)(CAN_MEM_BASE + address)) = ID_low | ID_high;
? ?address += 4;
? ? }

? ? // Set group standard Frame
? ? CAN_SFF_GRP_SA = address;
? ? for ( i = 0; i < ACCF_IDEN_NUM; i += 2 )
? ? {
? ? ? ? ID_low = (i << 29) | (GRP_STD_ID << 16);
? ?ID_high = ((i+1) << 13) | (GRP_STD_ID << 0);
? ?*((volatile uint32 *)(CAN_MEM_BASE + address)) = ID_low | ID_high;
? ?address += 4;
? ? }

? ? // Set explicit extended Frame
? ? CAN_EFF_SA = address;
? ? for ( i=0; i<ACCF_IDEN_NUM; i++)
? ? {
? ?ID_low = (i << 29) | (EXP_EXT_ID << 0);
? ?*((volatile uint32 *)(CAN_MEM_BASE + address)) = ID_low;
? ?address += 4;
? ? }

? ? // Set group extended Frame
? ? CAN_EFF_GRP_SA = address;
? ? for ( i = 0; i < ACCF_IDEN_NUM; i++ ?)
? ? {
? ?ID_low = (i << 29) | (GRP_EXT_ID << 0);
? ?*((volatile uint32 *)(CAN_MEM_BASE + address)) = ID_low;
? ?address += 4;
? ? }

? ? // Set End of Table
? ? CAN_EOT = address;
? ? return;
}

4,CAN2的發(fā)送函數(shù):

INT32U CAN2_Send( CAN_MSG *pTxBuf )
{
? ? INT32U CANStatus;

? ? CANStatus = CAN2SR;
? ? if ( CANStatus & 0x00000004 )
? ? {
? ?CAN2TFI1 = pTxBuf->Frame & 0xC00F0000;
? ?CAN2TID1 = pTxBuf->MsgID;
? ?CAN2TDA1 = pTxBuf->DataA;
? ?CAN2TDB1 = pTxBuf->DataB;
? ?CAN2CMR = 0x21;
? ?return ( TRUE );
? ? }
? ? else if ( CANStatus & 0x00000400 )
? ? {
? ? ? ? CAN2TFI2 = pTxBuf->Frame & 0xC00F0000;
? ? ? ? CAN2TID2 = pTxBuf->MsgID;
? ? ? ? CAN2TDA2 = pTxBuf->DataA;
? ? ? ? CAN2TDB2 = pTxBuf->DataB;
? ? ? ? CAN2CMR = 0x41;
? ? ? ? return ( TRUE );
? ? }
? ? else if ( CANStatus & 0x00040000 )
? ? {
? ? ? ? CAN2TFI3 = pTxBuf->Frame & 0xC00F0000;
? ? ? ? CAN2TID3 = pTxBuf->MsgID;
? ? ? ? CAN2TDA3 = pTxBuf->DataA;
? ? ? ? CAN2TDB3 = pTxBuf->DataB;
? ? ? ? CAN2CMR = 0x81;
? ? ? ? return ( TRUE );
? ? }
? ? return ( FALSE );
}

5,注意:CAN的接收中斷實(shí)現(xiàn)時(shí),在接收到數(shù)據(jù)后,先關(guān)掉CAN中斷使能,等數(shù)據(jù)處理完后,再打開(kāi)CAN中斷使能。這樣做是防止CAN數(shù)據(jù)傳輸快,而導(dǎo)致之前接收到的數(shù)據(jù)未處理完,就接收到下一組數(shù)據(jù)。產(chǎn)生數(shù)據(jù)混亂。

































































總結(jié)

以上是生活随笔為你收集整理的CAN通信机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。