Jump to content

    
Sign in to follow this  
nickson.b.k

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

Recommended Posts

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


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

Share this post


Link to post
Share on other sites
10 минут назад, nickson.b.k сказал:

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

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

Share this post


Link to post
Share on other sites
1 час назад, Arlleex сказал:

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

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

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

 

Share this post


Link to post
Share on other sites
1 час назад, nickson.b.k сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this