Developer от Бога

DV

четверг, 6 июля 2017 г.

STM32. Работа с акселерометром

Акселерометр LIS3DSH установленный на плате Discovery STM32F407VG прекрасно подходит для изучения интерфейсов SPI. Для лучшего изучения устройств и разных датчиков, необходимо будет купить переходник RS232->USB, чтоб в режиме реального времени смотреть график значений с осей акселерометра, и установить терминал имитирующий COM порт на компьютере.





Программа SPI передача проходит следующим образом:
Инициализация.
1)Ножка PE3 прижимается к нулю, что символизирует начало сеанса.
2)В SPI1_DR отправляем значение 0x20, это адрес регистра в акселерометре CTRL_REG4.
3)Ждем в цикле while пока не установится бит RXNE регистра SPI_SR в микроконтроллере, что будет символизировать о получении в ответ данных от акселерометра.
4)Читаем данные которые пришли в этот же регистр SPI1_DR, они нам не нужны, но прочитать нужно (SPIData=SPI1_DR;).
5)Тут же отправляем в регистр SPI1_DR настройки - значение для ранее подготовленного регистра CTRL_REG4 (установки осей, включения скорости считывания, что является одновременно и стартом работы акселерометра, значение = 0х97).
6)Ждем пока не придут ответные данные (они нам не нужны, но прочитать их нужно).
7)PE3 Ножку прижимаем к единице, что символизирует конец сеанса.

Чтение осей.
1)Ножка PE3 прижимается к нулю, что символизирует начало сеанса.
2)В SPI1_DR отправляем значение 0xA9 (адрес регистра OUT_X_H в акселерометре с выставленным старшим битом "чтение").
3)Ждем в цикле while пока не установится бит RXNE регистра SPI_SR в микроконтроллере, что будет символизировать о получении в ответ данных от акселерометра.
4)Читаем данные которые пришли в этот же регистр SPI1_DR, они нам не нужны, это всего-лишь данные в ответ на отправку адреса (mems_data = SPI1_DR;).
5)Тут же отправляем в регистр SPI1_DR пустое значение - чтоб запустить процесс отправки уже полезных данных с осей акселерометра нам, SPI1_DR=0x00;.6)Ждем пока не придут ответные данные, это уже данные значения осей акселерометра.
7)PE3 Ножку прижимаем к единице, что символизирует конец сеанса.



  1. void SystemInit(void)
  2. {
  3. }
  4. void USART2_ini(void)
  5. {
  6. RCC_GPIO|=0x1;//A
  7. GPIOA_MODER|=0xA0;
  8. GPIOA_AFRL|=0x7700;
  9. RCC_UART2|=0x20000;
  10. USART2_BRR=0x683;
  11. USART2_CR3|=0x80;
  12. USART2_CR1|=0xC;
  13. USART_Mode_Rx;
  14. USART2_CR1|=0x2000;
  15. }
  16. void SPI_ini(void)
  17. {
  18. RCC_GPIO=0x19;
  19. GPIOA_MODER|=0xA800;
  20. GPIOA_OSPEEDR=0xA800;
  21. GPIOA_AFRL=0x55500000;
  22. GPIOE_MODER|=0x40;
  23. GPIOE_OSPEEDR=0x80;
  24. GPIOE_PUPDR=0x40;
  25. GPIOE_BSRR=0x8;
  26. RCC_SPI1=0x1000;
  27. SPI1_CR1 |= 0x0002 |0x0001;
  28. SPI1_CR1 |=0x0300|0x0028;
  29. SPI1_CR1 |=0x04 ;
  30. SPI1_CRCPR=7;
  31. //SPI1_CR2|=0x3;
  32. SPI1_CR1|=0x0040;
  33. }
  34. void MEMS_ini(void)
  35. {
  36. uint8_t SPIData;
  37. GPIOE_BSRR=0x80000;
  38. SPI1_DR=0x20;
  39. while (!(SPI1_SR&0x1)==0x1);
  40. SPIData=SPI1_DR;
  41. SPI1_DR=0x97;
  42. while (!(SPI1_SR&0x1)==0x01);
  43. SPIData =SPI1_DR;
  44. GPIOE_BSRR=0x8;
  45. }
  46. short int mems_data(read_reg)
  47. {
  48. uint8_t mems_data;
  49. GPIOE_BSRR=0x80000;
  50. SPI1_DR=read_reg;
  51. while (!(SPI1_SR&0x1)==0x1);
  52. mems_data = SPI1_DR;
  53. SPI1_DR=0x00;
  54. while (!(SPI1_SR&0x1)==0x01);
  55. mems_data=SPI1_DR;
  56. GPIOE_BSRR=0x8;
  57. return -(mems_data+128);
  58. }
  59. void USART2_tx(data)
  60. {
  61. USART2_DR=data;
  62. while(!(USART2_SR&0x40)){};
  63. }
  64. int main(void)
  65. { uint8_t x=0xA9;// Адрес регистра нужной оси
  66. USART2_ini();
  67. SPI_ini();
  68. MEMS_ini();
  69. while(1)
  70. {
  71. USART2_tx(mems_data(x));
  72. }}
  73.  

Комментариев нет:

Отправить комментарий