Перейти к содержанию
    

Stm32f37xc.h CAN структура CAN_TxMailBox_TypeDef

Доброго времени!
Запускаю 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;


Подскажите, пожалуйста, как правильно выставлять бит в данном варианте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, nickson.b.k сказал:

Подскажите, пожалуйста, как правильно выставлять бит в данном варианте?

Последний вариант правильный. Только с индексами внимательнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Последний вариант правильный. Только с индексами внимательнее.

Не совсем. 
Как я уже выяснил, верная запись будет следующая))):
 

CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, nickson.b.k сказал:

Подскажите, пожалуйста, как правильно выставлять бит в данном варианте?

Глядя только на приведенный код:

CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ;

Насколько это правильно с  точки зрения CAN - судить не берусь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, пардон. Да, разумеется, выбрать регистр нужно было. У меня чуть иначе

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...