新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2016-4-9
- 在线时间
- 6 小时
|
1金钱
新手小白,用can通信发数据,却一直陷入死循环。数据发不出去。求大神指点,以下为我的程序代码。
can初始化程序及发送函数的定义:
#include "main.h"
uint8_t sbus_tx_buffer_data[8];//通过can1发送给电调的数据
/**************************************
函数功能:配置外设can1及相应的中断
函数形参:无
函数返回值:无
函数说明:CAN1_TX-----PA12 CAN1_RX-----PA11
***************************************/
void CAN1_Configuration(void)
{
CAN_InitTypeDef can;
CAN_FilterInitTypeDef can_filter;
GPIO_InitTypeDef gpio;
NVIC_InitTypeDef nvic;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//管脚复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);
//管脚设置
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11;
gpio.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &gpio);
//can总线接收中断
nvic.NVIC_IRQChannel = CAN1_RX0_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 2;
nvic.NVIC_IRQChannelSubPriority = 1;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
//can总线发送中断
nvic.NVIC_IRQChannel = CAN1_TX_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 1;
nvic.NVIC_IRQChannelSubPriority = 1;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
CAN_DeInit(CAN1);
CAN_StructInit(&can);
//can总线初始化
can.CAN_TTCM = DISABLE;
can.CAN_ABOM = DISABLE;
can.CAN_AWUM = DISABLE;
can.CAN_NART = DISABLE;
can.CAN_RFLM = DISABLE;
can.CAN_TXFP = ENABLE;
can.CAN_Mode = CAN_Mode_LoopBack;
can.CAN_SJW = CAN_SJW_1tq;
can.CAN_BS1 = CAN_BS1_16tq;
can.CAN_BS2 = CAN_BS2_8tq;
can.CAN_Prescaler = 1680; //CAN BaudRate 42000k/(1+16+8)/1680=1kbps
CAN_Init(CAN1, &can);
//can1总线滤器组初始化
can_filter.CAN_FilterNumber=0;
can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;
can_filter.CAN_FilterScale=CAN_FilterScale_32bit;
can_filter.CAN_FilterIdHigh=0x0000;
can_filter.CAN_FilterIdLow=0x0000;
can_filter.CAN_FilterMaskIdHigh=0x0000;
can_filter.CAN_FilterMaskIdLow=0x0000;
can_filter.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;
can_filter.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&can_filter);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);
}
/**************************************
函数功能:can1总线发送中断
函数形参:无
函数返回值:无
函数说明:无
***************************************/
void CAN1_TX_IRQHandler(void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET) //等待发送完成
{
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);//清除发送中断标志
}
}
/**************************************
函数功能:can1总线接收中断
函数形参:无
函数返回值:无
函数说明:无
***************************************/
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg rx_message;
int i=0;
if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)//等待接收完成
{
CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);;//清除接收中断标志
CAN_Receive(CAN1, CAN_FIFO0, &rx_message);//将所得数据存入结构体变量rx_message
if(rx_message.StdId == 0x200)
{ for(i=0;i<8;i++)
printf("rxbuf[%d]:%d\r\n ",i,rx_message.Data[i]);
}
}
}
/**************************************
函数功能:通过can1向左前轮发送数据函数
函数形参:u8* msg,u8 len(数据和数据长度)
函数返回值:无
函数说明:要注意发送ID
***************************************/
void Can_Send_Msg_lf(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x200; // 11位标准标识符为0x200为主控发送给电机的数据
TxMessage.ExtId=0x00; // 设置扩展标示符(29位)
TxMessage.IDE=CAN_ID_STD; // 使用标准标示符
TxMessage.RTR=CAN_RTR_DATA; // 消息类型为数据帧,一帧8位
TxMessage.DLC=len; // 发送一帧信息
for(i=0;i<8;i++)
{
sbus_tx_buffer_data[i]=(uint8_t)0x10;
}
for(i=0;i<8;i++)
{
printf("sbus_tx_buffer_data[%d] is %0x\r\n ",i,sbus_tx_buffer_data[i]);
printf("\n");
}
for(i=0;i<8;i++)
TxMessage.Data[i]=sbus_tx_buffer_data[i]; // 第一帧信息
mbox= CAN_Transmit(CAN1, &TxMessage);
printf(" mbox is %d\r\n ", mbox);
printf("\n");
for(i=0;i<8;i++)
{
printf("TxMessage.Data[%d] is %0x\r\n ",i,TxMessage.Data[i]);
printf("\n");
}
i=0;
while(CAN_TransmitStatus(CAN1, mbox)!=CAN_TxStatus_Ok)
{
mbox=CAN_Transmit(CAN1, &TxMessage);
LED_GREEN_ON();
}
// printf("传输完成!!!!\r\n");
delay_ms(500);
LED_GREEN_OFF();
}
主函数程序
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Led_Configuration();
USART2_Configuration();
USART3_Configuration();
CAN1_Configuration();
CAN2_Configuration();
Buzzer_Configuration();
Power_Detection_Configuration();
pid_assignment();
while(1)
{
Can_Send_Msg_lf(sbus_tx_buffer_data,8);//通过can1向左前轮发送数据函数
printf("ok");
delay_ms(200);
}
}
|
|