STM32f042f6p6單片機芯片的的CAN總線調試代碼分享給大家
單片機源程序如下:
- * @attention
- * CAN_TX<----->PB9
- * CAN_RX<----->PB8
- ******************************************************************************
- */
- #include "iso_can.h"
- #include "iso_led.h"
- #include "iso_usart1.h"
- typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
- /* 在中斷處理函數中返回 */
- uint8_t Receive_Buffer_Len=0;
- uint8_t ReceiveBuffer[255];
- uint8_t *pReceiveBuffer=ReceiveBuffer;
- volatile TestStatus TestRx;
- /*
- * 函數名:CAN_NVIC_Configuration
- * 描述 :CAN RX0 中斷優先級配置
- * 輸入 :無
- * 輸出 : 無
- * 調用 :內部調用
- */
- static void CAN_NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* Enable the USART1 Interrupt */
- NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /*
- * 函數名:CAN_GPIO_onfiguration
- * 描述 :CAN GPIO 和時鐘配置
- * 輸入 :無
- * 輸出 : 無
- * 調用 :內部調用
- */
- static void CAN_GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE);
-
- /* CAN1 Periph clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
-
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_4);
- GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_4);
-
- /* Configure CAN pin: RX */ // PB8
-
- GPIO_InitStructure.GPIO_Pin = CAN_RX;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- /* Configure CAN pin: TX */ // PB9
- GPIO_InitStructure.GPIO_Pin = CAN_TX;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- }
- /*
- * 函數名:CAN_Polling
- * 描述 :配置 CAN 的工作模式為 回環模式
- * 輸入 :無
- * 輸出 : -PASSED 成功
- * -FAILED 失敗
- * 調用 :內部調用
- */
- TestStatus CAN_Polling(void)
- {
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- CanTxMsg TxMessage;
- CanRxMsg RxMessage;
- uint32_t i = 0;
- uint8_t TransmitMailbox = 0;
-
- /* CAN register init */
- CAN_DeInit(CAN);
- CAN_StructInit(&CAN_InitStructure);
-
- /* CAN cell init */
- CAN_InitStructure.CAN_TTCM=DISABLE; // 時間觸發通信禁止
- CAN_InitStructure.CAN_ABOM=DISABLE; // 離線退出是在中斷置位清0后退出
- CAN_InitStructure.CAN_AWUM=DISABLE; // 自動喚醒模式:清零sleep
- CAN_InitStructure.CAN_NART=DISABLE; // 自動重新傳送豹紋,知道發送成功
- CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO沒有鎖定,新報文覆蓋舊報文
- CAN_InitStructure.CAN_TXFP=DISABLE; // 發送報文優先級確定:標志符
- CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; // 回環模式
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有關
- CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
- CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
- CAN_InitStructure.CAN_Prescaler=5; // 分頻系數為5
- CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1
-
- /* CAN filter init */
- CAN_FilterInitStructure.CAN_FilterNumber=0;
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
- CAN_FilterInit(&CAN_FilterInitStructure);
-
- /* transmit */
- TxMessage.StdId=0x11; // 設定標準標識符(11位,擴展的為29位)
- TxMessage.RTR=CAN_RTR_DATA; // 傳輸消息的幀類型為數據幀(還有遠程幀)
- TxMessage.IDE=CAN_ID_STD; // 消息標志符實驗標準標識符
- TxMessage.DLC=2; // 發送兩幀,一幀8位
- TxMessage.Data[0]=0xCA; // 第一幀數據
- TxMessage.Data[1]=0xFE; // 第二幀數據
-
- TransmitMailbox=CAN_Transmit(CAN, &TxMessage);
- i = 0;
- // 用于檢查消息傳輸是否正常
- while((CAN_TransmitStatus(CAN, TransmitMailbox) != CANTXOK) && (i != 0xFF))
- {
- i++;
- }
-
- i = 0;
- // 檢查返回的掛號的信息數目
- while((CAN_MessagePending(CAN, CAN_FIFO0) < 1) && (i != 0xFF))
- {
- i++;
- }
-
- /* receive */
- RxMessage.StdId=0x00;
- RxMessage.IDE=CAN_ID_STD;
- RxMessage.DLC=0;
- RxMessage.Data[0]=0x00;
- RxMessage.Data[1]=0x00;
- CAN_Receive(CAN, CAN_FIFO0, &RxMessage);
-
-
- if (RxMessage.StdId!=0x11)
- {
- return FAILED;
- }
-
- if (RxMessage.IDE!=CAN_ID_STD)
- {
- return FAILED;
- }
-
- if (RxMessage.DLC!=2)
- {
- return FAILED;
- }
-
- /* 判斷發送的信息和接收的信息是否相等 */
- if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
- {
- return FAILED;
- }
-
- printf("receive data:0X%X,0X%X",RxMessage.Data[0], RxMessage.Data[1]);
-
- return PASSED; /* Test Passed */
- }
- /**
- * @brief Configures the CAN, transmit and receive using interrupt.
- * @param None
- * @retval : PASSED if the reception is well done, FAILED in other case
- */
- /*
- * 函數名:CAN_Interrupt
- * 描述 :配置 CAN 的工作模式為 中斷模式
- * 輸入 :無
- * 輸出 : -PASSED 成功
- * -FAILED 失敗
- * 調用 :內部調用
- */
- static void CAN_InterruptMode_Configuration(void)
- {
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- /* CAN register init */
- CAN_DeInit(CAN);
- CAN_StructInit(&CAN_InitStructure);
-
- /* CAN cell init */
- CAN_InitStructure.CAN_TTCM=DISABLE; // 時間觸發通信禁止
- CAN_InitStructure.CAN_ABOM=DISABLE; // 離線退出是在中斷置位清0后退出
- CAN_InitStructure.CAN_AWUM=DISABLE; // 自動喚醒模式:清零sleep
- CAN_InitStructure.CAN_NART=DISABLE; // 自動重新傳送豹紋,知道發送成功
- CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO沒有鎖定,新報文覆蓋舊報文
- CAN_InitStructure.CAN_TXFP=DISABLE; // 發送報文優先級確定:標志符
- CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; // 正常模式
- CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有關
- CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
- CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
- CAN_InitStructure.CAN_Prescaler=1; // 分頻系數為1
- CAN_Init(CAN, &CAN_InitStructure); // 初始化CAN1
-
- /* CAN filter init */
- CAN_FilterInitStructure.CAN_FilterNumber=1;
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
- CAN_FilterInit(&CAN_FilterInitStructure);
-
- /* CAN FIFO0 message pending interrupt enable */
- CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE); //中斷使能
-
- }
- void CAN_Transmit_Buffer(uint8_t* pBuffer,uint16_t NumByteToWrite)
- {
- uint8_t NumOfPake=0,NumOfSingle=0,cnt=0;
- CanTxMsg TxMessage;
- NumOfPake=NumByteToWrite/8 ;
- NumOfSingle=NumByteToWrite%8 ;
- TxMessage.StdId=0x00; // 標準標識符為0
- TxMessage.ExtId=0x1234; // 設置擴展標示符(29位)
- TxMessage.IDE=CAN_ID_EXT; // 使用擴展標識符
- TxMessage.RTR=CAN_RTR_DATA; // 消息類型為數據幀,一幀8位
- while(NumOfPake--)
- {
- /* transmit 1 message */
- TxMessage.DLC=8;
- for(cnt=0;cnt<8;cnt++)
- {
- TxMessage.Data[cnt]=* pBuffer;
- pBuffer++;
- }
- CAN_Transmit(CAN, &TxMessage);
- }
- if(NumOfSingle)
- {
- TxMessage.DLC=NumOfSingle;
- for(cnt=0;cnt<NumOfSingle;cnt++)
- {
- TxMessage.Data[cnt]=* pBuffer;
- pBuffer++;
- }
- CAN_Transmit(CAN, &TxMessage);
- }
-
- }
- /*
- * 函數名:CAN_Init
- * 描述 :CAN初始化,包括端口初始化和中斷優先級初始化
- * 輸入 :無
- * 輸出 : 無
- * 調用 :外部調用
- */
- void USER_CAN_Init(void)
- {
- CAN_NVIC_Configuration();
- CAN_GPIO_Configuration();
- }
- /*
- * 函數名:CAN_Test
- * 描述 :CAN 回環模式跟中斷模式測試
- * 輸入 :無
- * 輸出 : 無
- * 調用 :外部調用
- */
- void USER_CAN_Test(void)
- {
- /* CAN transmit at 100Kb/s and receive by polling in loopback mode */
- TestRx = CAN_Polling();
-
- if (TestRx == FAILED)
- {
- ISO_LED(LED1,OFF); // LED1 OFF
- }
- else
- {
- ISO_LED(LED1,ON); // LED1 ON;
- }
-
- /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode */
- CAN_InterruptMode_Configuration();
- }
- /*-------------------------------------------------------------------------------*/
- void CAN_Loopback_Test(void)
- {
- /* LED config */
- LED_GPIO_Config();
-
- printf( "\r\n 這個一個CAN(回環模式和中斷模式)測試程序...... \r\n" );
-
- USER_CAN_Init();
- printf( "\r\n CAN 回環測試初始化成功...... \r\n" );
-
- USER_CAN_Test();
- while (1)
- {
-
- }
- }
- /*----------------------------------------END OF FILE---------------------------------------------------*/
復制代碼- /* Includes ------------------------------------------------------------------*/
- #include "iso_usart1.h"
- #include "iso_dma.h"
- #include "iso_can.h"
- /** @addtogroup ISO_KEY_Examples
- * @{
- */
- /** @addtogroup ISO_KEY
- * @{
- */
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- /**
- * @brief Main program.
- * @param None
- * @retval None
- */
- int main(void)
- {
- /*!< At this stage the microcontroller clock setting is already configured,
- this is done through SystemInit() function which is called from startup
- file (startup_stm32f0xx.s) before to branch to application main.
- To reconfigure the default setting of SystemInit() function, refer to
- system_stm32f0xx.c file
- */
- SystemInit ();
- USART1_Config();
- printf("\r\nFengChi STM32F0 NOTE Board CAN Test...\r\n");
- printf("\r\nTime:%s\r\n", "("__DATE__ " - " __TIME__ ")");
- USART_DMACmd(USART1,USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
- ISO_DMAChannel_Config(DMA1_Channel2,(u32)&USART1->TDR,(u32)g_DMA_USART_Buffer,\
- DMA_DIR_PeripheralDST,DMA_Mode_Circular,43);
- DMA_Cmd(DMA1_Channel2, ENABLE);
- ISO_DMAChannel_Config(DMA1_Channel3,(u32)&USART1->RDR,(u32)g_DMA_USART_Buffer,\
- DMA_DIR_PeripheralSRC,DMA_Mode_Circular,Max_DMA_USART_Buffer_Len);
- DMA_Cmd(DMA1_Channel3, ENABLE);
- CAN_Loopback_Test();
- while (1)
- {
- }
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* Infinite loop */
- while (1)
- {
- }
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復制代碼
所有資料51hei提供下載:
19-ISO_CAN.7z
(216.85 KB, 下載次數: 115)
2019-3-12 15:58 上傳
點擊文件名下載附件
|