123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #include "hal_can.h"
- #include "stm32f4xx.h"
- #include "stm32f4xx_gpio.h"
- #include <string.h>
- CanTxMsg tx_message;
- CanRxMsg rx_message;
- pcan_rx pcan_rx_back = NULL;
- pcan_tx pcan_tx_back = NULL;
- u8 hal_can1_mode_init(uint8_t tsjw, uint8_t tbs2, uint8_t tbs1, uint16_t brp, uint8_t mode)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- CAN_DeInit(CAN1);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
-
- CAN_InitStructure.CAN_TTCM = DISABLE;
- CAN_InitStructure.CAN_ABOM = DISABLE;
- CAN_InitStructure.CAN_AWUM = DISABLE;
- CAN_InitStructure.CAN_NART = DISABLE;
- CAN_InitStructure.CAN_RFLM = DISABLE;
- CAN_InitStructure.CAN_TXFP = DISABLE;
- CAN_InitStructure.CAN_Mode = mode;
- CAN_InitStructure.CAN_SJW = tsjw;
- CAN_InitStructure.CAN_BS1 = tbs1;
- CAN_InitStructure.CAN_BS2 = tbs2;
- CAN_InitStructure.CAN_Prescaler = brp;
- CAN_Init(CAN1, &CAN_InitStructure);
-
- 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 = CAN_Filter_FIFO0;
- CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
- CAN_FilterInit(&CAN_FilterInitStructure);
- CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- return 0;
- }
- void hal_can_init(void)
- {
- #if defined(__CAN_BAUD_500K)
- hal_can1_mode_init(CAN_SJW_1tq, CAN_BS2_6tq, CAN_BS1_7tq, 6, CAN_Mode_Normal);
- #elif defined(__CAN_BAUD_250K)
- hal_can1_mode_init(CAN_SJW_1tq, CAN_BS2_6tq, CAN_BS1_7tq, 12, CAN_Mode_Normal);
- #else
- #error no can baud macro!;
- #endif
- }
- uint8_t hal_can_msg_tx(uint32_t id, uint8_t id_type, uint8_t *p_data, uint8_t len)
- {
- uint8_t flg = 0;
- if (id_type)
- {
- tx_message.ExtId = id;
- }
- else
- {
- tx_message.StdId = id_type;
- }
- tx_message.IDE = id_type;
- tx_message.RTR = CAN_RTR_Data;
- tx_message.DLC = len;
- memcpy(tx_message.Data, p_data, len);
- flg = CAN_Transmit(CAN1, &tx_message);
- return flg;
- }
- void hal_can_rx_back_init(pcan_rx p_fun)
- {
- pcan_rx_back = p_fun;
- }
- void hal_can_tx_back_init(pcan_tx p_fun)
- {
- pcan_tx_back = p_fun;
- }
- void CAN1_TX_IRQHandler(void)
- {
- if (pcan_tx_back != NULL)
- {
- pcan_tx_back();
- }
- }
- void CAN1_RX0_IRQHandler(void)
- {
- CAN_Receive(CAN1, CAN_FIFO0, &rx_message);
- if (pcan_rx_back != NULL)
- {
- pcan_rx_back(rx_message);
- }
- }
|