|

楼主 |
发表于 2013-9-5 21:31:05
|
显示全部楼层
我的CAN代码
#include "stm32f4xx.h"
/**
* @brief Configures the NVIC for CAN.
* @param None
* @retval None
*/
void CAN_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructureCAN1;
NVIC_InitTypeDef NVIC_InitStructureCAN2;
//#ifdef USE_CAN1
NVIC_InitStructureCAN1.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructureCAN1.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructureCAN1.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructureCAN1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructureCAN1);
//#else /* USE_CAN2 */
NVIC_InitStructureCAN2.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructureCAN2.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructureCAN2.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructureCAN2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructureCAN2);
}
/**
* @brief Configures the CAN1.
* @param None
* @retval None
*/
void CAN_Config_CAN1(void)
{
GPIO_InitTypeDef GPIO_InitStructureCAN1;
CAN_InitTypeDef CAN_InitStructureCAN1;
CAN_FilterInitTypeDef CAN_FilterInitStructureCAN1;
/* CAN GPIOs configuration **************************************************/
//方法1--good
//使能RX--GPIOI---> IN9
/* Enable GPIO clock */
//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
/* Connect CAN pins to AF9 */
//配置CAN1--RX
/*GPIO_PinAFConfig(GPIOI, GPIO_PinSource9, GPIO_AF_CAN1);
GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructureCAN1.GPIO_PuPd = GPIO_PuPd_UP;//RX为上拉输入
GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOI, &GPIO_InitStructureCAN1);*/
//配置CAN1--TX
/*RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource13, GPIO_AF_CAN1);
GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructureCAN1.GPIO_PuPd = GPIO_PuPd_UP;//RX为上拉输入
GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOH, &GPIO_InitStructureCAN1);*/
//方法2--good
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
/* Connect CAN pins to AF9 */
GPIO_PinAFConfig(GPIOI, GPIO_PinSource9, GPIO_AF_CAN1);//RX
GPIO_PinAFConfig(GPIOH, GPIO_PinSource13, GPIO_AF_CAN1);//TX
/* Configure CAN RX and TX pins */
GPIO_InitStructureCAN1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_13;
GPIO_InitStructureCAN1.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructureCAN1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureCAN1.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureCAN1.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOI, &GPIO_InitStructureCAN1);
GPIO_Init(GPIOH, &GPIO_InitStructureCAN1);
/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN register init */
CAN_DeInit(CAN1);
/* CAN cell init */
CAN_InitStructureCAN1.CAN_TTCM = DISABLE;
CAN_InitStructureCAN1.CAN_ABOM = DISABLE;
CAN_InitStructureCAN1.CAN_AWUM = DISABLE;
CAN_InitStructureCAN1.CAN_NART = DISABLE;
CAN_InitStructureCAN1.CAN_RFLM = DISABLE;
CAN_InitStructureCAN1.CAN_TXFP = ENABLE;
CAN_InitStructureCAN1.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructureCAN1.CAN_SJW = CAN_SJW_1tq;
/* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
CAN_InitStructureCAN1.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructureCAN1.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructureCAN1.CAN_Prescaler = 4;//2 --->> 1M速度 ; 4 --->> 500k速度
CAN_Init(CAN1, &CAN_InitStructureCAN1);
/* CAN filter init */
CAN_FilterInitStructureCAN1.CAN_FilterNumber = 0;
CAN_FilterInitStructureCAN1.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructureCAN1.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructureCAN1.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructureCAN1.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructureCAN1.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructureCAN1.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructureCAN1.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructureCAN1.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructureCAN1);
/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
/**
* @brief Configures the CAN2.
* @param None
* @retval None
*/
void CAN_Config_CAN2(void)
{
GPIO_InitTypeDef GPIO_InitStructureCAN2;
CAN_InitTypeDef CAN_InitStructureCAN2;
CAN_FilterInitTypeDef CAN_FilterInitStructureCAN2;
/* CAN GPIOs configuration **************************************************/
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/* Connect CAN pins to AF9 */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_CAN2);//RX
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_CAN2); //TX
/* Configure CAN RX and TX pins */
GPIO_InitStructureCAN2.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;//RX--TX
GPIO_InitStructureCAN2.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructureCAN2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureCAN2.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureCAN2.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructureCAN2);
/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2/*CAN_CLK*/, ENABLE);
/* CAN register init */
CAN_DeInit(CAN2);
/* CAN cell init */
CAN_InitStructureCAN2.CAN_TTCM = DISABLE;
CAN_InitStructureCAN2.CAN_ABOM = DISABLE;
CAN_InitStructureCAN2.CAN_AWUM = DISABLE;
CAN_InitStructureCAN2.CAN_NART = DISABLE;
CAN_InitStructureCAN2.CAN_RFLM = DISABLE;
CAN_InitStructureCAN2.CAN_TXFP = ENABLE;
CAN_InitStructureCAN2.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructureCAN2.CAN_SJW = CAN_SJW_1tq;
/* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */
CAN_InitStructureCAN2.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructureCAN2.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructureCAN2.CAN_Prescaler = 4;//2 --->> 1M速度 ; 4 --->> 500k速度
if(CAN_Init(CAN2, &CAN_InitStructureCAN2)!=CANINITOK)
{
printf("can init error\\r\\n");
}
//CAN_Init(CAN2, &CAN_InitStructureCAN2);
/* CAN filter init */
CAN_FilterInitStructureCAN2.CAN_FilterNumber = 14;
CAN_FilterInitStructureCAN2.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructureCAN2.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructureCAN2.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructureCAN2.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructureCAN2.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructureCAN2.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructureCAN2.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructureCAN2.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructureCAN2);
/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}
//CAN初始化
void InitCANBus()
{
CAN_NVIC_Config();
printf("CAN_NVIC_Config\\r\\n");
CAN_Config_CAN1();
printf("CAN_Config_CAN1\\r\\n");
CAN_Config_CAN2();
printf("CAN_Config_CAN2\\r\\n");
} |
|