nickson.b.k 0 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба Доброго времени! Запускаю CAN на МК stm32f373r8t6 при помощи регистров используя reference manual на данный камень. В виду малого опыта работы со структурами, возникла ошибка выставления бита TXRQ в регистре CAN_TI0R. Разработчики файла stm32f373xc.h решили регистры настройки TxBox объединить в единую структуру. Вот она: /* * взято из stm32f373xc.h */ typedef struct { __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ __IO uint32_t TDLR; /*!< CAN mailbox data low register */ __IO uint32_t TDHR; /*!< CAN mailbox data high register */ } CAN_TxMailBox_TypeDef; А данная структура является частью другой структуры. Вот из того же файла: typedef struct { __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ uint32_t RESERVED2; /*!< Reserved, 0x208 */ __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ uint32_t RESERVED3; /*!< Reserved, 0x210 */ __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ uint32_t RESERVED4; /*!< Reserved, 0x218 */ __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ } CAN_TypeDef; Изначально я попробовал сделать так, чтобы выставить нужны мне бит: CAN -> TI0R |= CAN_TI0R_TXRQ; но, конечно же, это не сработало. Понял, что запись будет примерно такой: CAN -> sTxMailBox[1] |= CAN_TI0R_TXRQ; Подскажите, пожалуйста, как правильно выставлять бит в данном варианте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба 10 минут назад, nickson.b.k сказал: Подскажите, пожалуйста, как правильно выставлять бит в данном варианте? Последний вариант правильный. Только с индексами внимательнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nickson.b.k 0 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба 1 час назад, Arlleex сказал: Последний вариант правильный. Только с индексами внимательнее. Не совсем. Как я уже выяснил, верная запись будет следующая))): CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба 1 час назад, nickson.b.k сказал: Подскажите, пожалуйста, как правильно выставлять бит в данном варианте? Глядя только на приведенный код: CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ; Насколько это правильно с точки зрения CAN - судить не берусь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба А, пардон. Да, разумеется, выбрать регистр нужно было. У меня чуть иначе u32 can_SendFrame(u32 rtr, uCANID id, u8 msg[], u8 len) { u32 sr = CANCTL->TSR, rets = 0; if(sr & CAN_TSR_TME) { CAN_TxMailBox_TypeDef *mbox; if(sr & CAN_TSR_TME0) mbox = &CANCTL->sTxMailBox[0]; else if(sr & CAN_TSR_TME1) mbox = &CANCTL->sTxMailBox[1]; else if(sr & CAN_TSR_TME2) mbox = &CANCTL->sTxMailBox[2]; if(id.ext) mbox->TIR = id.id << 3 | B2; else mbox->TIR = id.id << 21; if(rtr) mbox->TIR |= B1, mbox->TDTR = 0; else { if(len > 8) len = 8; mbox->TDTR = len; u32 data[2] = {0}; for(u8 i = 0; i < len; ++i) ((u8 *)data)[i] = msg[i]; mbox->TDLR = data[0]; mbox->TDHR = data[1]; } mbox->TIR |= B0; } else rets = 1; return rets; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться