- //S選擇模式 高速 接地 靜默模式 接高電 PA15
- //PA11 CANRX PA12 CANTX
- //can總線io口配置初始化
- void can_io_init(void)
- {
-
- GPIO_InitTypeDef GPIO_Structure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
-
- GPIO_Structure.GPIO_Pin=GPIO_Pin_12; //管腳
- GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz; //輸出速度
- GPIO_Structure.GPIO_Mode=GPIO_Mode_AF_PP; //復用推挽輸出
- GPIO_Init(GPIOA,&GPIO_Structure); //初始化PA12
-
- GPIO_Structure.GPIO_Pin=GPIO_Pin_11; //管腳
- GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Structure.GPIO_Mode=GPIO_Mode_IPU; //上拉輸入
- GPIO_Init(GPIOA,&GPIO_Structure); //初始化PA11
-
- GPIO_Structure.GPIO_Pin=GPIO_Pin_15; //管腳
- GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Structure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOA,&GPIO_Structure); //初始化PA15
- GPIO_ResetBits(GPIOA,GPIO_Pin_15); //寫低電平
- }
- //can總線工作模式設置
- void can_structure(void)
- {
- //主控MCR寄存器設置 can工作模式
- CAN_InitTypeDef CAN_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); //打開can1時鐘總線
- CAN_DeInit(CAN1); //清除can通訊寄存器
-
- CAN_StructInit(&CAN_InitStructure);
- CAN_InitStructure.CAN_TXFP=DISABLE; //優先級由報文標識符決定
- CAN_InitStructure.CAN_RFLM=DISABLE; //三個郵箱收滿時 溢出時覆蓋原有的報文
- CAN_InitStructure.CAN_NART=ENABLE; //報文發送失敗時會不斷的繼續發送
- CAN_InitStructure.CAN_AWUM=DISABLE; //檢測到報文,自動喚醒can
- CAN_InitStructure.CAN_ABOM=DISABLE;// 離線過程 對INRQ置1 在清0初始化can寄存器如果還是檢測到隱性就自動退出
- CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時間觸發通訊模式
- CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//正常模式
- //can 波特率設置 位時序 baud=1/正常位時間 baud=1mbps
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度為1個時間單位
- CAN_InitStructure.CAN_BS1=CAN_BS1_7tq;//時間段1占用8個時間單位
- CAN_InitStructure.CAN_BS2=CAN_BS2_4tq; //時間段2占用7個時間單位
- CAN_InitStructure.CAN_Prescaler=6; //分頻系數5
- CAN_Init(CAN1,&CAN_InitStructure); //初始化can1
- }
- //can濾波器設置函數 接收
- void Filter_Sturcture(void)
- {
- CAN_FilterInitTypeDef CAN_FilterStructure;
- CAN_FilterStructure.CAN_FilterNumber=0; //過濾器0
- CAN_FilterStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//標識符屏蔽位
- CAN_FilterStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32 位寬
- CAN_FilterStructure.CAN_FilterIdHigh=0x0000;////32 位 標識符
- CAN_FilterStructure.CAN_FilterIdLow=0x0000;
- CAN_FilterStructure.CAN_FilterMaskIdHigh=0x0000;//32 位 MASK屏蔽寄存器
- CAN_FilterStructure.CAN_FilterMaskIdLow=0x0000;
-
- CAN_FilterStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;// FIFO0
- CAN_FilterStructure.CAN_FilterActivation=ENABLE; //激活過濾器 0
- CAN_FilterInit(&CAN_FilterStructure); //初始化過濾器0
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0使能can通訊中斷 接收 //發送CAN_IT_TME
- //發送中斷
- CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE); //發送郵箱空中斷
- // CAN_ITConfig(CAN1,CAN_IT_FF0,ENABLE);
- }
- void can_nvic_structure(void)
- {
- // CAN1_RX1_IRQn處理FIFO1中斷
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中斷組別1
- NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;//設置can總線中斷線FIF0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優先級0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應優先級
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN1_TX_IRQn;//設置can總線中斷線
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優先級0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//響應優先級
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
- NVIC_Init(&NVIC_InitStructure);
- //USB_LP_CAN1_RX0_IRQn互聯型 如上
- }
- //can初始化函數
- void can_Init(void)
- {
- can_io_init();
- can_structure();
- Filter_Sturcture();
- can_nvic_structure();
- }
- //發送數據函數
- //return 0;發送成功
- // 其他;失敗
- u8 can_senddate(u8 *date,u8 len)
- {
- u8 i=0,j=0,mbox=0;
- //設定標識符 共11位 取值范圍 0~0x7FF
- //決定該幀優先級 數值越小 優先級越高
- CanTxMsg CanTxMsgStructure;
- CanTxMsgStructure.StdId=0x314; //標準標識符
- CanTxMsgStructure.ExtId=0;//設定擴展標識符 共18bit 取值范圍 0~0x3FFFF
- CanTxMsgStructure.IDE=CAN_ID_STD; //標準格式
- CanTxMsgStructure.RTR=CAN_RTR_Data; //數據幀
- CanTxMsgStructure.DLC=len; //數據長度
- for(i=0;i<len;i++)
- {
- CanTxMsgStructure.Data[i]=date[i];//can總線上裝載數據
- }
- mbox=CAN_Transmit(CAN1,&CanTxMsgStructure); //發送數據
- while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(j<0XFFF)) j++;
- if(j>0xFFF) return 1;
- return 0;
- }
- //接收中斷函數
- void USB_LP_CAN1_RX0_IRQHandler(void) //PA11 PA12
- {
- CanRxMsg RxMessage;
- int i=0;
- RxMessage.StdId=0x00;
- RxMessage.ExtId=0x00;
- RxMessage.IDE=0;
- RxMessage.DLC=0;
- RxMessage.FMI=0;
- RxMessage.Data[0]=0x00;
- RxMessage.Data[1]=0x00;
- RxMessage.Data[2]=0x00;
- RxMessage.Data[3]=0x00;
- RxMessage.Data[4]=0x00;
- RxMessage.Data[5]=0x00;
- RxMessage.Data[6]=0x00;
- RxMessage.Data[7]=0x00;
- CAN_Receive(CAN1,CAN_Filter_FIFO0,&RxMessage); //接受數據
- for(i=0;i<8;i++)
- {
- recive_buf[i]=RxMessage.Data[i];
- }
-
- Rx_finish_Flag=1;
- }
- //發送中斷函數
- void USB_HP_CAN1_TX_IRQHandler(void) //CAN TX
- {
- if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET)
- {
- // LED4=!LED4;
- CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
- }
- }
- //can數據查詢收到
- u8 can_recive_check(void)
- {
- u32 i=0;
- CanRxMsg CanRxMsgStructure;
- //檢測有無數據收到
- CanRxMsgStructure.StdId=0x00;
- CanRxMsgStructure.ExtId=0x00;
- CanRxMsgStructure.IDE=0;
- CanRxMsgStructure.DLC=0;
- CanRxMsgStructure.FMI=0;
- CanRxMsgStructure.Data[0]=0x00;
- CanRxMsgStructure.Data[1]=0x00;
- CanRxMsgStructure.Data[2]=0x00;
- CanRxMsgStructure.Data[3]=0x00;
- CanRxMsgStructure.Data[4]=0x00;
- CanRxMsgStructure.Data[5]=0x00;
- CanRxMsgStructure.Data[6]=0x00;
- CanRxMsgStructure.Data[7]=0x00;
- CAN_Receive(CAN1, CAN_Filter_FIFO0, &CanRxMsgStructure);//讀取數據
- for(i=0;i<8;i++)
- {
- recive_buf[i]=CanRxMsgStructure.Data[i];
- }
- return CanRxMsgStructure.DLC;
- }
復制代碼
芯片型號 STM32F103VCT6
會不會是因為PA11和PA12IO口有其他功能復用了。求解答感謝
|