Урок 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();
}
Соберём код и прошьём контроллер и посмотрим, загорелся ли у нас зелёный светодиод
У нас светится светодиод, значит мы на правильном пути.
Теперь для дальнейшей инициализации акселерометра нам потребуется функция для записи данных в регистры нашего датчика
//—————————————
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 Следующая часть
Техническая документация на датчик
Купить отладочную плату можно здесь STM32F4-DISCOVERY
Смотреть ВИДЕОУРОК
Добавить комментарий