STM Урок 41. Подключаем акселерометр LIS3DSH. Часть 2



Урок 41

 

Часть 2

 

Подключаем акселерометр LIS3DSH

 

В предыдущей чатсти нашего занятия мы кратко изучили документацию на датчик, создали для него проект, добавили некоторые макросы и настроили библиотечные файлы.

 

Давайте теперь напишем функцию для приема и передачи по SPI:

 

//—————————————

static uint8_t SPIx_WriteRead(uint8_t Byte)

{

  uint8_t receivedbyte = 0;

  if(HAL_SPI_TransmitReceive(&hspi1, (uint8_t*) &Byte, (uint8_t*) &receivedbyte, 1, 0x1000) != HAL_OK)

  {

    Error();

  }

  return receivedbyte;

}

//—————————————

 

 

Добавим ещё кое-какие макроподстановки в заголовочный файл lis3dsh.h:

 

#define LD6_OFF HAL_GPIO_WritePin(LD_PORT, LD6, GPIO_PIN_RESET) //BLUE

//————————————————

#define CS_GPIO_PORT GPIOE

#define CS_PIN GPIO_PIN_3

#define CS_ON HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_RESET)

#define CS_OFF HAL_GPIO_WritePin(CS_GPIO_PORT, CS_PIN, GPIO_PIN_SET)

#define DUMMY_BYTE                        ((uint8_t)0x00)

//————————————————

#define LIS3DSH_WHO_AM_I_ADDR                0x0F

//————————————————

#define READWRITE_CMD                     ((uint8_t)0x80)

#define MULTIPLEBYTE_CMD                  ((uint8_t)0x40)

//————————————————

 

Добавим код в функцию Accel_IO_Read, изменив в ней также аргументы и входные и возвращаемое значение:

 

void Accel_IO_Read(uint8_t *pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)

{

  if(NumByteToRead > 0x01)

  {

    ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);

  }

  else

  {

    ReadAddr |= (uint8_t)READWRITE_CMD;

  }

        CS_ON;

  SPIx_WriteRead(ReadAddr);

  while(NumByteToRead > 0x00)

  {

    /* Send dummy byte (0x00) to generate the SPI clock to ACCELEROMETER (Slave device) */

    *pBuffer = SPIx_WriteRead(DUMMY_BYTE);

    NumByteToRead—;

    pBuffer++;

  }

        CS_OFF;

}

 

Добавим строку в функцию Accel_ReadID:

 

uint8_t Accel_ReadID(void)

{  

  uint8_t ctrl = 0;

  Accel_IO_Read(&ctrl, LIS3DSH_WHO_AM_I_ADDR, 1);

  return ctrl;

}

 

 

Ну и также добавим код в функцию инициализации Accel_Ini:

 

void Accel_Ini(void)

{

uint16_t ctrl = 0x0000;

HAL_Delay(1000);

if(Accel_ReadID() == 0x3F) LD4_ON;

else Error();

}

 

Соберём код и прошьём контроллер и посмотрим, загорелся ли у нас зелёный светодиод

 

image17

 

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

Теперь для дальнейшей инициализации акселерометра нам потребуется функция для записи данных в регистры нашего датчика

 

//—————————————

void Accel_IO_Write(uint8_t *pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)

{

        CS_OFF;

  if(NumByteToWrite > 0x01)

  {

    WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD;

  }

        CS_ON;

        SPIx_WriteRead(WriteAddr);

        while(NumByteToWrite >= 0x01)

  {

    SPIx_WriteRead(*pBuffer);

    NumByteToWrite—;

    pBuffer++;

  }

        CS_OFF;

}

//—————————————

 

В следующей части занятия мы закончим писать инициализацию акселерометра, а также напишем функцию считывания данных с датчика.

 

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

Техническая документация на датчик

Программа NS Port Monitor

 

 

Купить отладочную плату можно здесь STM32F4-DISCOVERY

 

 

Смотреть ВИДЕОУРОК

 

STM32 Подключаем акселерометр LIS3DSH

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*