Акселерометр 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 Ножку прижимаем к единице, что символизирует конец сеанса.
Программа 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 Ножку прижимаем к единице, что символизирует конец сеанса.
- void SystemInit(void)
- {
- }
- void USART2_ini(void)
- {
- RCC_GPIO|=0x1;//A
- GPIOA_MODER|=0xA0;
- GPIOA_AFRL|=0x7700;
- RCC_UART2|=0x20000;
- USART2_BRR=0x683;
- USART2_CR3|=0x80;
- USART2_CR1|=0xC;
- USART_Mode_Rx;
- USART2_CR1|=0x2000;
- }
- void SPI_ini(void)
- {
- RCC_GPIO=0x19;
- GPIOA_MODER|=0xA800;
- GPIOA_OSPEEDR=0xA800;
- GPIOA_AFRL=0x55500000;
- GPIOE_MODER|=0x40;
- GPIOE_OSPEEDR=0x80;
- GPIOE_PUPDR=0x40;
- GPIOE_BSRR=0x8;
- RCC_SPI1=0x1000;
- SPI1_CR1 |= 0x0002 |0x0001;
- SPI1_CR1 |=0x0300|0x0028;
- SPI1_CR1 |=0x04 ;
- SPI1_CRCPR=7;
- //SPI1_CR2|=0x3;
- SPI1_CR1|=0x0040;
- }
- void MEMS_ini(void)
- {
- uint8_t SPIData;
- GPIOE_BSRR=0x80000;
- SPI1_DR=0x20;
- while (!(SPI1_SR&0x1)==0x1);
- SPIData=SPI1_DR;
- SPI1_DR=0x97;
- while (!(SPI1_SR&0x1)==0x01);
- SPIData =SPI1_DR;
- GPIOE_BSRR=0x8;
- }
- short int mems_data(read_reg)
- {
- uint8_t mems_data;
- GPIOE_BSRR=0x80000;
- SPI1_DR=read_reg;
- while (!(SPI1_SR&0x1)==0x1);
- mems_data = SPI1_DR;
- SPI1_DR=0x00;
- while (!(SPI1_SR&0x1)==0x01);
- mems_data=SPI1_DR;
- GPIOE_BSRR=0x8;
- return -(mems_data+128);
- }
- void USART2_tx(data)
- {
- USART2_DR=data;
- while(!(USART2_SR&0x40)){};
- }
- int main(void)
- { uint8_t x=0xA9;// Адрес регистра нужной оси
- USART2_ini();
- SPI_ini();
- MEMS_ini();
- while(1)
- {
- USART2_tx(mems_data(x));
- }}
Комментариев нет:
Отправить комментарий