现在,我正在与一个STMF429核子144板工作,我正在努力使CAN工作。这是我的密码:
int intCAN();
int intFilter();
int pins();
int main(void)
{
//int CAN
pins();
intFilter();
intCAN();
CAN1->sTxMailBox[0].TDLR = 0;
CAN1->sTxMailBox[0].TDHR = 0;
CAN1->sTxMailBox[0].TDLR |= 0x8; //DATA0 = 1000
CAN1->sTxMailBox[0].TIR |= CAN_TI0R_TXRQ; //send mailbox
}
int pins()
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
//RX
GPIOD->MODER &= GPIO_MODER_MODER0_1;
GPIOD->OTYPER &= ~(GPIO_OTYPER_OT0);
GPIOD->PUPDR &= ~(GPIO_PUPDR_PUPDR0);
GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED0_0|GPIO_OSPEEDR_OSPEED0_1;
//TX
GPIOD->MODER |= GPIO_MODER_MODER1_1;
GPIOD->OTYPER &= ~(GPIO_OTYPER_OT1);
GPIOD->PUPDR &= ~(GPIO_PUPDR_PUPDR1);
GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED1_0|GPIO_OSPEEDR_OSPEED1_1;
return 0;
}
int intCAN()
{
RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;
CAN1->MCR &= ~(CAN_MCR_SLEEP);
CAN1->MCR |= CAN_MCR_INRQ; //Initilization Request
CAN1->BTR |= CAN_BTR_LBKM; //Loop Back Mode
CAN1->BTR |= 0x7; //BRP = 7
CAN1->BTR |= CAN_BTR_TS2_0|CAN_BTR_TS2_1|CAN_BTR_TS2_2; //Seg 2 = 7
CAN1->BTR |= CAN_BTR_TS1_0|CAN_BTR_TS1_1|CAN_BTR_TS1_2|CAN_BTR_TS1_3; //Seg 1 = 16
CAN1->BTR |= CAN_BTR_SJW_0; //Small Jump Width = 1
CAN1->MCR &= ~(CAN_MCR_INRQ); //exit initilization mode
//Testing
CAN1->sTxMailBox[0].TIR &= ~CAN_TI0R_RTR;
CAN1->sTxMailBox[0].TIR &= ~CAN_TI0R_IDE; //Standard Identifier
CAN1->sTxMailBox[0].TIR &= ~CAN_TI0R_STID;
CAN1->sTxMailBox[0].TIR |= (0x1 << CAN_TI0R_STID_Pos); //Message ID = 1
//Message
CAN1->sTxMailBox[0].TDTR &= ~CAN_TDT0R_DLC;
CAN1->sTxMailBox[0].TDTR |= (0x1 << CAN_TDT0R_DLC_Pos); //Data Length = 1 Byte
return 0;
}
int intFilter()
{
RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;
CAN1->FA1R &= ~(CAN_FA1R_FACT0);
CAN1->FMR |= CAN_FMR_FINIT; //Initilization Mode Filter
CAN1->FM1R |= CAN_FM1R_FBM0; //Filter Bank 0 2 32bit register Identifier List Mode
CAN1->FS1R |= CAN_FS1R_FSC0;
CAN1->FFA1R &= ~(CAN_FFA1R_FFA0);
CAN1->sFilterRegister[0].FR1 |= 0x0;
CAN1->sFilterRegister[0].FR1 |= CAN_F0R1_FB0; //ID Filter = 1
CAN1->FMR &= ~(CAN_FMR_FINIT); //Exit Initilization Mode Filter
CAN1->FA1R |= CAN_FA1R_FACT0;
return 0;hoping是PD0 Pin,RX Pin是PD1 Pin,当我运行这个程序时,我得到的只是一个恒定的主导信号,这不是我所希望的。我只是用逻辑分析器测试TX。我很有信心,这基本上是真的,但我遗漏了一些东西(很明显)。我只想使用寄存器(CMSIS)而不使用HAL。有人知道我能做什么吗?
谢谢你,吉夫凯
我尝试了在回圈模式和不同的配置,但没有任何工作。我是新来的。
Edit1:首先,我只想得到所需的输出,这应该是一个完整的CAN消息,我可以在中查看它。
发布于 2022-11-22 14:43:01
我找出了为什么不起作用。我将GPIO设置为备用函数,但必须指定要使用哪个备用函数,因此必须添加以下内容:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
(void)RCC->AHB1ENR;
//RX
GPIOD->MODER |= GPIO_MODER_MODER0_1;
GPIOD->AFR[0] |= GPIO_AFRL_AFRL0_0|GPIO_AFRL_AFRL0_3; //this was missing
GPIOD->OTYPER &= ~(GPIO_OTYPER_OT0);
GPIOD->PUPDR &= ~(GPIO_PUPDR_PUPDR0);
GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED0_0|GPIO_OSPEEDR_OSPEED0_1;
//TX
GPIOD->MODER |= GPIO_MODER_MODER1_1;
GPIOD->AFR[0] |= GPIO_AFRL_AFRL1_0|GPIO_AFRL_AFRL1_3; //and this
GPIOD->OTYPER &= ~(GPIO_OTYPER_OT1);
GPIOD->PUPDR &= ~(GPIO_PUPDR_PUPDR1);
GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED1_0|GPIO_OSPEEDR_OSPEED1_1;
return 0;现在可以工作,现在我没有得到我希望的输出,但我正在达到。
发布于 2022-11-21 17:08:22
在STM32F4xx勘误表中列出了一个硬件错误,它说您不能在设置RCC_AHB1ENR_GPIODEN之后立即写入GPIOD->MODER。你至少需要一个周期的延迟。
我这样做:
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
(void)RCC->AHB1ENR; // dummy read to wait for enable to propagate
GPIOD->MODER &= GPIO_MODER_MODER0_1;这可能不是唯一的问题,但首先解决这个问题,看看是否有帮助。
https://stackoverflow.com/questions/74521094
复制相似问题