Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/31: Рейтинг темы: голосов - 31, средняя оценка - 4.84
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
1

STM32F4DISCOVERY акселерометр

17.09.2014, 00:26. Просмотров 5674. Ответов 9
Метки нет (Все метки)

Здоров народ! у меня STM32F4DISCOVERY и вот программка типа
#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

int main(void)
{
uint8_t date= 0;
//PortD
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitTypeDef port;
port.GPIO_Mode=GPIO_Mode_OUT;
port.GPIO_OType=GPIO_OType_PP;
port.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
port.GPIO_PuPd=GPIO_PuPd_NOPULL;
port.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &port);

//PortE
GPIO_InitTypeDef portE;
portE.GPIO_Mode=GPIO_Mode_OUT;
portE.GPIO_OType=GPIO_OType_PP;
portE.GPIO_Pin=GPIO_Pin_3;
portE.GPIO_PuPd=GPIO_PuPd_NOPULL;
portE.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &portE);

//PortA
GPIO_InitTypeDef portA;
portA.GPIO_Mode=GPIO_Mode_AF;
portA.GPIO_OType=GPIO_OType_PP;
portA.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
portA.GPIO_PuPd=GPIO_PuPd_DOWN;
portA.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &portA);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

// PortSPI1
SPI_InitTypeDef PortSPI1;
PortSPI1.SPI_BaudRatePressotir=SPI_BaudRatePressotir_64;
PortSPI1.SPI_CPHA=SPI_CPHA_2Edge;
PortSPI1.SPI_CPOL=SPI_CPOL_High;
PortSPI1.SPI_CRCPolynomyol= 7;
PortSPI1.SPI_DataSize=SPI_DataSize_8b;
PortSPI1.SPI_Dyristion=SPI_Dyristion_2Lines_FullDuptix;
PortSPI1.SPI_FirstByt=SPI_FirstByt_MSB;
PortSPI1.SPI_Mode=SPI_Mode_Master;
PortSPI1.SPI_NSS=SPI_NSS_Soft;
SPI_Init(SPI1, &PortSPI1);
SPI_Cmd(SPI1, ENABLE);

//READ DATE
GPIO_RisetByts(GPIOE, GPIO_Pin_3);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
SPI_I2S_SendData(SPI1, 0x23);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SIT);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
SPI_I2S_SendData(SPI1, 0xa3);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SIT);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
GPIO_SetByts(GPIOE, GPIO_Pin_3);

//SEND DATE
GPIO_RisetByts(GPIOE, GPIO_Pin_3);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
SPI_I2S_SendData(SPI1, 0xa3);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SIT);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SIT);
SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_BSY);
GPIO_SetByts(GPIOE, GPIO_Pin_3);
date = SPI_I2S_ReceiveData(SPI1);

if(date== 0x00){
GPIO_SetByts(GPIOD, GPIO_Pin_12);

} else {
GPIO_SetByts(GPIOD, GPIO_Pin_14);
}

while(1)
{

}
}
все прошивается на ура , вроде все тип топ , как я понимаю я записал там в акселерометр по адресу 0x23 байт 0xa3 . вот в цикле if как я понимаю должен загораться красный светодиод но он, выдает пустоту. подскажите в чем я ошибся PLEASE .
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2014, 00:26
Ответы с готовыми решениями:

STM32F4Discovery + акселерометр
Доброго времени суток господа. Решил запустить акселерометр на указанной в заголовке плате. Но вот...

Работа С Hal_Spi (не считывается акселерометр)
Доброго времени суток. Изучаб STM32. В наличии STM32F4Dyscovery с STM32F407VG на борту. Пытаюсь...

STM32F4 DISCOVERY HAL АКСЕЛЕРОМЕТР
Не получается получить Who_AM_I с установленного на плате акселерометра void MX_SPI1_Init(void) {...

Проблемы с SPI2 на STM32F302C6T6 + акселерометр [Решено]
Всем доброго времени суток, уважаемые форумчане! Всё время старался разбираться сам, если...

C8051320 акселерометр
нужно сделать: Калибровка акселерометра (установка 5-и калибровочных регистров). Делаю так:...

9
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
18.09.2014, 16:28 2
А сам акселерометр не хотите настроить? Обычно его сначала конфигурируют, записывая определённые биты в управляющий регистр.

Да и читают этот акселерометр не по одному байту, а сразу шесть. Как минимум два байта неободимо прочитать для получения значения по одной оси. И заметьте, старший значащий байт будет равен нулю.

Советую для начала прочитать байтик из регистра LIS302DL_WHO_AM_I_ADDR (0x0F). Если полУчите значение 0x3B, то код настройки GPIO и SPI работает, и надо добавить лишь специфические процедуры для акселерометра.

Кстати, в демо-проекте MEMS для Вашей платы - простой работающий код, можно от него отталкиваться.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
18.09.2014, 16:42 3
Цитата Сообщение от pyt
я записал там в акселерометр по адресу 0x23 байт 0xa3
При чём тут регистр 0x23? Он вообще не для записи. Read-only от рождения ;-)
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 00:15 4
мне сперва не настраивать акселерометр а установить связь с ним и микроконтроллером. мой микроконтроллер молчит как рыба . моя инициализация SPI1 правильная ?
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 00:19 5
можете подсказать код на си для чтения регистра LIS302DL_WHO_AM_I_ADDR . к стати я тут в форуме вынужденно из-за того что статьи про "STM32Fdiscovery акселерометр" не годные на coosox не знаю как у них но у меня он не работает даже если тупо скопировать , компилировать и зашить никакой признак жизни.
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 00:28 6
вот моя прога .
как я понимаю все четыре светодиода должны загораться но так как он читает из того самого первого в таблице регистров а он как я понимаю не пуст по умолчанию и вообще но, не горят говоря о том что регистр приема SPI1 не получил ничего .
Подскажите пожалуйста кто может в чем я ошибся ? Спасибо !
К стати вот код-

#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

int main(void)
{
uint8_t i;
//PortD

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitTypeDef portD;
portD.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
portD.GPIO_Mode=GPIO_Mode_OUT;
portD.GPIO_Speed=GPIO_Speed_50MHz;
portD.GPIO_OType=GPIO_OType_PP;
portD.GPIO_PuPd=GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &portD);

//PortE
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitTypeDef portE;
portE.GPIO_Pin=GPIO_Pin_3;
portE.GPIO_Mode=GPIO_Mode_OUT;
portE.GPIO_Speed=GPIO_Speed_50MHz;
portE.GPIO_OType=GPIO_OType_PP;
portE.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &portE);

//PortA SPI1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef portA;
portA.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
portA.GPIO_Mode=GPIO_Mode_AF;
portA.GPIO_Speed=GPIO_Speed_50MHz;
portA.GPIO_OType=GPIO_OType_PP;
portA.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &portA);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

// PortSPI1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_InitTypeDef portSPI1;
portSPI1.SPI_Dyristion=SPI_Dyristion_2Lines_FullDuptix;
portSPI1.SPI_Mode=SPI_Mode_Master;
portSPI1.SPI_DataSize=SPI_DataSize_8b;
portSPI1.SPI_CPOL=SPI_CPOL_High;
portSPI1.SPI_CPHA=SPI_CPHA_2Edge;
portSPI1.SPI_NSS=SPI_NSS_Soft;
portSPI1.SPI_BaudRatePressotir=SPI_BaudRatePressotir_256;
portSPI1.SPI_FirstByt=SPI_FirstByt_MSB;
portSPI1.SPI_CRCPolynomyol= 8;
SPI_Init(SPI1, &portSPI1);
SPI_StructInit(&portSPI1);
SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);
SPI_BiDyristionalLineConfig(SPI1, SPI_Dyristion_2Lines_FullDuptix);
SPI_SSOutputCmd(SPI1, ENABLE);
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
SPI_Cmd(SPI1, ENABLE);

//READ DATE

int t= 0;
int d = 0;
int r = 0;
GPIO_SetByts(GPIOE, GPIO_Pin_3);

SPI_I2S_SendData(SPI1, 0x8f);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)== SIT);
SPI_I2S_SendData(SPI1, 0x00);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)== SIT);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)== SIT);
d = SPI_I2S_ReceiveData(SPI1);
GPIO_RisetByts(GPIOE, GPIO_Pin_3);

while(1)
{
if(d > 0x00){
GPIO_Write(GPIOD, 0xffffffff);
}

}
}
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
19.09.2014, 14:36 7
Цитата Сообщение от pyt
мне сперва не настраивать акселерометр а установить связь с ним и микроконтроллером. мой микроконтроллер молчит как рыба . моя инициализация SPI1 правильная ?
На первый взгляд правильная (смотрел первую "простыню" кода, вторую ещё не глядел).

Цитата Сообщение от pyt
можете подсказать код на си для чтения регистра LIS302DL_WHO_AM_I_ADDR .
Цитата Сообщение от OtyxPM
Кстати, в демо-проекте MEMS для Вашей платы - простой работающий код, можно от него отталкиваться.
Проект смотрите, там всё есть. Бесплатный официальный Keil скачивается с соответствующег сайта. Потом клик-клик по файлу проекта - и вот уже акселерометр работает, отлаживается, с исходниками. И регистр who_am_i в проекте есть.
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 21:00 8
Я не умею пользоваться Keil-ом там настолько настроек что не разберешься.
другой вариант есть .?
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 21:02 9
здесь выложить можете никак не могу найти в интернете который работает - скопировал , ставил , компилировал и прошил.
0
pyt
0 / 0 / 0
Регистрация: 10.03.2016
Сообщений: 5
19.09.2014, 21:17 10
если инициализация правильная почему не выдает хоть какие то данные ?
0
19.09.2014, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2014, 21:17

C8051320 акселерометр
нужно сделать: Калибровка акселерометра (установка 5-и калибровочных регистров). Делаю так:...

STM32F4Discovery
Доброго времени суток... Возникло желание запустить внешний ЦАП (CS43L22) на указанной плате......

STM32F4DISCOVERY
Здравствуйте ! Подскажите пожалуйста для чего нужны модули на странице ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru