首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAN与STM32F4

CAN与STM32F4
EN

Stack Overflow用户
提问于 2022-11-21 15:16:35
回答 2查看 41关注 0票数 0

现在,我正在与一个STMF429核子144板工作,我正在努力使CAN工作。这是我的密码:

代码语言:javascript
复制
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消息,我可以在中查看它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-22 14:43:01

我找出了为什么不起作用。我将GPIO设置为备用函数,但必须指定要使用哪个备用函数,因此必须添加以下内容:

代码语言:javascript
复制
    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;

现在可以工作,现在我没有得到我希望的输出,但我正在达到。

票数 1
EN

Stack Overflow用户

发布于 2022-11-21 17:08:22

在STM32F4xx勘误表中列出了一个硬件错误,它说您不能在设置RCC_AHB1ENR_GPIODEN之后立即写入GPIOD->MODER。你至少需要一个周期的延迟。

我这样做:

代码语言:javascript
复制
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
(void)RCC->AHB1ENR;  // dummy read to wait for enable to propagate

GPIOD->MODER &= GPIO_MODER_MODER0_1;

这可能不是唯一的问题,但首先解决这个问题,看看是否有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74521094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档