|
- //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; //復(fù)用推挽輸出
- 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); //寫(xiě)低電平
- }
- //can總線工作模式設(shè)置
- void can_structure(void)
- {
- //主控MCR寄存器設(shè)置 can工作模式
- CAN_InitTypeDef CAN_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); //打開(kāi)can1時(shí)鐘總線
- CAN_DeInit(CAN1); //清除can通訊寄存器
-
- CAN_StructInit(&CAN_InitStructure);
- CAN_InitStructure.CAN_TXFP=DISABLE; //優(yōu)先級(jí)由報(bào)文標(biāo)識(shí)符決定
- CAN_InitStructure.CAN_RFLM=DISABLE; //三個(gè)郵箱收滿時(shí) 溢出時(shí)覆蓋原有的報(bào)文
- CAN_InitStructure.CAN_NART=ENABLE; //報(bào)文發(fā)送失敗時(shí)會(huì)不斷的繼續(xù)發(fā)送
- CAN_InitStructure.CAN_AWUM=DISABLE; //檢測(cè)到報(bào)文,自動(dòng)喚醒can
- CAN_InitStructure.CAN_ABOM=DISABLE;// 離線過(guò)程 對(duì)INRQ置1 在清0初始化can寄存器如果還是檢測(cè)到隱性就自動(dòng)退出
- CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時(shí)間觸發(fā)通訊模式
- CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//正常模式
- //can 波特率設(shè)置 位時(shí)序 baud=1/正常位時(shí)間 baud=1mbps
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度為1個(gè)時(shí)間單位
- CAN_InitStructure.CAN_BS1=CAN_BS1_7tq;//時(shí)間段1占用8個(gè)時(shí)間單位
- CAN_InitStructure.CAN_BS2=CAN_BS2_4tq; //時(shí)間段2占用7個(gè)時(shí)間單位
- CAN_InitStructure.CAN_Prescaler=6; //分頻系數(shù)5
- CAN_Init(CAN1,&CAN_InitStructure); //初始化can1
- }
- //can濾波器設(shè)置函數(shù) 接收
- void Filter_Sturcture(void)
- {
- CAN_FilterInitTypeDef CAN_FilterStructure;
- CAN_FilterStructure.CAN_FilterNumber=0; //過(guò)濾器0
- CAN_FilterStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//標(biāo)識(shí)符屏蔽位
- CAN_FilterStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32 位寬
- CAN_FilterStructure.CAN_FilterIdHigh=0x0000;////32 位 標(biāo)識(shí)符
- 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; //激活過(guò)濾器 0
- CAN_FilterInit(&CAN_FilterStructure); //初始化過(guò)濾器0
- CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0使能can通訊中斷 接收 //發(fā)送CAN_IT_TME
- //發(fā)送中斷
- CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE); //發(fā)送郵箱空中斷
- // 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;//設(shè)置can總線中斷線FIF0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優(yōu)先級(jí)0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應(yīng)優(yōu)先級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN1_TX_IRQn;//設(shè)置can總線中斷線
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//搶占優(yōu)先級(jí)0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//響應(yīng)優(yōu)先級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
- NVIC_Init(&NVIC_InitStructure);
- //USB_LP_CAN1_RX0_IRQn互聯(lián)型 如上
- }
- //can初始化函數(shù)
- void can_Init(void)
- {
- can_io_init();
- can_structure();
- Filter_Sturcture();
- can_nvic_structure();
- }
- //發(fā)送數(shù)據(jù)函數(shù)
- //return 0;發(fā)送成功
- // 其他;失敗
- u8 can_senddate(u8 *date,u8 len)
- {
- u8 i=0,j=0,mbox=0;
- //設(shè)定標(biāo)識(shí)符 共11位 取值范圍 0~0x7FF
- //決定該幀優(yōu)先級(jí) 數(shù)值越小 優(yōu)先級(jí)越高
- CanTxMsg CanTxMsgStructure;
- CanTxMsgStructure.StdId=0x314; //標(biāo)準(zhǔn)標(biāo)識(shí)符
- CanTxMsgStructure.ExtId=0;//設(shè)定擴(kuò)展標(biāo)識(shí)符 共18bit 取值范圍 0~0x3FFFF
- CanTxMsgStructure.IDE=CAN_ID_STD; //標(biāo)準(zhǔn)格式
- CanTxMsgStructure.RTR=CAN_RTR_Data; //數(shù)據(jù)幀
- CanTxMsgStructure.DLC=len; //數(shù)據(jù)長(zhǎng)度
- for(i=0;i<len;i++)
- {
- CanTxMsgStructure.Data[i]=date[i];//can總線上裝載數(shù)據(jù)
- }
- mbox=CAN_Transmit(CAN1,&CanTxMsgStructure); //發(fā)送數(shù)據(jù)
- while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(j<0XFFF)) j++;
- if(j>0xFFF) return 1;
- return 0;
- }
- //接收中斷函數(shù)
- 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); //接受數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- recive_buf[i]=RxMessage.Data[i];
- }
-
- Rx_finish_Flag=1;
- }
- //發(fā)送中斷函數(shù)
- 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數(shù)據(jù)查詢收到
- u8 can_recive_check(void)
- {
- u32 i=0;
- CanRxMsg CanRxMsgStructure;
- //檢測(cè)有無(wú)數(shù)據(jù)收到
- 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);//讀取數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- recive_buf[i]=CanRxMsgStructure.Data[i];
- }
- return CanRxMsgStructure.DLC;
- }
復(fù)制代碼
芯片型號(hào) STM32F103VCT6
會(huì)不會(huì)是因?yàn)镻A11和PA12IO口有其他功能復(fù)用了。求解答感謝
|
|