11 years, 12 months ago.

Reading registers from Nucleo

I found a lot of examples how to read registers from LPC17xx boards. In the file LPC17xx.h all pointers to the registers are listed (LPC_SC, LPC_I2C1 etc). But where can I found the same for the Nucleo board? The reason I want to read the registers is because the I2C function does not work on the Nucleo board with a program and an I2C-device which allways worked on my LPC1768 board. Any suggestions?

2 Answers

11 years, 12 months ago.

Here: http://mbed.org/users/mbed_official/code/mbed-src/file/0182c99221bc/targets/cmsis/TARGET_STM/TARGET_NUCLEO_L152RE/stm32l1xx.h (see the folders in the url, they always use that structure, only the ST ones are filled with ST's own device driver library, so bit harder to find)

11 years, 12 months ago.

Accessing the url directly returns "Sorry, this page is currently unavailable." So I downloaded the whole repository. Now I am searching for the appropriate identifier to read the I2C registers. If I have success I let you know. Maybe you can give me a short example? Thank you.

Yeah the site seems to have some issues with some code currently, I also couldn't load it from a user repository, but when I went to the code via the API page it worked fine.

You did already find the file at targets/cmsis/TARGET_STM/TARGET_NUCLEO_L152RE/stm32l1xx.h?

Relevant code parts (simply by searching for I2C):

typedef struct
{
  __IO uint16_t CR1;          /*!< I2C Control register 1,                      Address offset: 0x00 */
  uint16_t  RESERVED0;        /*!< Reserved,                                    0x02                 */
  __IO uint16_t CR2;          /*!< I2C Control register 2,                      Address offset: 0x04 */
  uint16_t  RESERVED1;        /*!< Reserved,                                    0x06                 */
  __IO uint16_t OAR1;         /*!< I2C Own address register 1,                  Address offset: 0x08 */
  uint16_t  RESERVED2;        /*!< Reserved,                                    0x0A                 */
  __IO uint16_t OAR2;         /*!< I2C Own address register 2,                  Address offset: 0x0C */
  uint16_t  RESERVED3;        /*!< Reserved,                                    0x0E                 */
  __IO uint16_t DR;           /*!< I2C Data register,                           Address offset: 0x10 */
  uint16_t  RESERVED4;        /*!< Reserved,                                    0x12                 */
  __IO uint16_t SR1;          /*!< I2C Status register 1,                       Address offset: 0x14 */
  uint16_t  RESERVED5;        /*!< Reserved,                                    0x16                 */
  __IO uint16_t SR2;          /*!< I2C Status register 2,                       Address offset: 0x18 */
  uint16_t  RESERVED6;        /*!< Reserved,                                    0x1A                 */
  __IO uint16_t CCR;          /*!< I2C Clock control register,                  Address offset: 0x1C */
  uint16_t  RESERVED7;        /*!< Reserved,                                    0x1E                 */
  __IO uint16_t TRISE;        /*!< I2C TRISE register,                          Address offset: 0x20 */
  uint16_t  RESERVED8;        /*!< Reserved,                                    0x22                 */
} I2C_TypeDef;

(From this we learn this peripheral was copy pasted from a 16-bit microcontroller, I guess they don't like changing something that works. One of the advantages of NXP microcontrollers, they have little of that legacy).

And:

#define I2C1                ((I2C_TypeDef *) I2C1_BASE)
#define I2C2                ((I2C_TypeDef *) I2C2_BASE)

So apparantly they start counting at 1. Addressing a register should be something like:

I2C1->CR1 = 0xFF;
posted by Erik - 21 Mar 2014

At least the compiler will accept it. Further testing will be done tomorrow. Thank you very much. I think this can give me more detailed view into the Nucleo processor.

posted by Hans Oppermann 21 Mar 2014