void can1_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
/* CAN1 時鐘*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* Configure CAN pin: RX */ // PA11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX */ // PA12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//
// GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); //端口復用為CAN1
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB8:CAN-RX
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //輸入上拉
// GPIO_Init(GPIOB, &GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9:CAN-TX
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用模式
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/****************************************************************************
* 名 稱:TestStatus CAN_Interrupt(void)
* 功 能:中斷模式下的CAN收發
* 入口參數:無
* 出口參數:無
* 說 明:
* 調用方法:無
****************************************************************************/
void can1_Interrupt(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
// CanTxMsg TxMessage;
/* CAN寄存器初始化 */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN單元初始化 */
CAN_InitStructure.CAN_TTCM = ENABLE; //MCR-TTCM 時間觸發通信模式使能
CAN_InitStructure.CAN_ABOM = ENABLE; //MCR-ABOM 自動離線管理
CAN_InitStructure.CAN_AWUM = ENABLE; //MCR-AWUM 自動喚醒模式
CAN_InitStructure.CAN_NART = DISABLE; //MCR-NART 禁止報文自動重傳 0-自動重傳 1-報文只傳一次
CAN_InitStructure.CAN_RFLM = ENABLE; //MCR-RFLM 接收FIFO 鎖定模式 0-溢出時新報文會覆蓋原有報文 1-溢出時,新報文丟棄
CAN_InitStructure.CAN_TXFP = ENABLE; //MCR-TXFP 發送FIFO優先級 0-優先級取決于報文標示符 1-優先級取決于發送請求的順序
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack 環回模式 CAN_Mode_Normal
/*波特率*////9600
// CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //BTR-SJW 重新同步跳躍寬度 1個時間單元
// CAN_InitStructure.CAN_BS1 = CAN_BS1_1tq; //BTR-TS1 時間段1 占用了2個時間單元
// CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; //BTR-TS1 時間段2 占用了3個時間單元
// CAN_InitStructure.CAN_Prescaler = 945;
///*波特率*/9.4 k
CAN_InitStructure.CAN_SJW = CAN_SJW_4tq; //BTR-SJW 重新同步跳躍寬度 1個時間單元
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //BTR-TS1 時間段1 占用了2個時間單元
CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq; //BTR-TS1 時間段2 占用了3個時間單元
CAN_InitStructure.CAN_Prescaler = 358;
/////////// 350 < CAN_Prescaler < 372
// CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //BTR-SJW 重新同步跳躍寬度 1個時間單元
// CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq; //BTR-TS1 時間段1 占用了2個時間單元
// CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; //BTR-TS1 時間段2 占用了3個時間單元
// CAN_InitStructure.CAN_Prescaler = 487;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN過濾器初始化 */
CAN_FilterInitStructure.CAN_FilterNumber=13; //
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //FM1R 過濾器組0的工作模式。
//0: 過濾器組x的2個32位寄存器工作在標識符屏蔽位模式;
//1: 過濾器組x的2個32位寄存器工作在標識符列表模式。
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //FS1R 過濾器組0(13~0)的位寬。
//0:過濾器位寬為2個16位; 1:過濾器位寬為單個32位。
// /* 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴展ID不是如下的就拋棄掉,是的話,會存入FIFO0。 */
// CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x1234<<3)&0xFFFF0000)>>16; //要過濾的ID高位
// CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x1234<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要過濾的ID低位
// CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
// CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
/* 全為0,忽略了報文標識符判別 */
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; //FFAx : 過濾器位寬設置 報文在通過了某過濾器的過濾后,
//將被存放到其關聯的FIFO中。 0:過濾器被關聯到FIFO0; 1:過濾器被關聯到FIFO1。
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //FACTx : 過濾器激活 軟件對某位設置1來激活相應的過濾器。只有對FACTx位清0,
//或對CAN_FMR寄存器的FINIT位設置1后,才能修改相應的過濾器寄存器
//x(CAN_FxR[0:1])。 0:過濾器被禁用; 1:過濾器被激活。
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 接收中斷使能 */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
|