新手入门
积分 12
金钱 12
注册时间 2018-8-14
在线时间 0 小时
4 金钱
我在做两块板f103的的通信,回环模式两块板都正常,现在正常模式下无法通信,作用是一块板的按键按下后另一块板的灯亮,程序如下
#include "stm32f10x.h"
#include "can.h"
#include "led.h"
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);//延时
}
void KeyInit(void)//按键初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void GetKey(void)
{
if(Bit_RESET == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15))
{
Delay(1000000);
if(Bit_RESET==GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15))
{
while(Bit_RESET==GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)){ ; }
can_tx(0X55,0X77);
}
}
if(Bit_RESET == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))
{
Delay(1000000);
if(Bit_RESET == GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))
{
while(Bit_RESET==GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)){ ; }
can_tx(0X99,0Xbb);
}
}
}
#include "can.h"
#include "led.h"
#include "stdio.h"
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
__IO uint32_t ret = 0;
volatile TestStatus TestRx;
/*CAN RX0 ÖD¶ÏóÅÏè¼¶ÅäÖÃ */
void CAN_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* enabling interrupt */
NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void CAN_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* Configure CAN pin: RX */ // PB8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure CAN pin: TX */ // PB9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void CAN_INIT(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=ENABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler=4;
CAN_Init(CAN1,&CAN_InitStructure);
/* 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=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}
void can_tx(u8 Data1,u8 Data2)
{
CanTxMsg TxMessage;
TxMessage.StdId=0x00;
TxMessage.ExtId=0x0000;
TxMessage.IDE=CAN_ID_EXT;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC=2;
TxMessage.Data[0]=Data1;
TxMessage.Data[1]=Data2;
CAN_Transmit(CAN1,&TxMessage);
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage); //½óêÕFIFO0ÖDμÄêy¾Y
if((RxMessage.Data[0]==0x99)&&(RxMessage.Data[1]==0xbb))
{ LED1(0);LED2(1);}
if((RxMessage.Data[0]==0x55)&&(RxMessage.Data[1]==0x77))
{ LED1(1);LED2(0);}
}
int main(void)
{
SystemInit();
KeyInit();
LED_GPIO_Config();
CAN_GPIO_Config();
CAN_NVIC_Configuration();
CAN_INIT();
while(1)
{
GetKey();
}
}
led程序没写出来但是回环模式能用,应该没问题,can模块用的是TJA1050,5v供电,两模块canh对接,canl对接,接线应该没问题,两块板子是一样的,烧录一样的程序,求各位大佬看看是什么问题
我来回答