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

Проблемы с SPI. STM32F103C6 + гироскоп L3G4200D [решено]

10.10.2012, 18:44. Просмотров 12694. Ответов 6
Метки нет (Все метки)

Здравствуйте. Подключаю гироскоп L3G4200D к STM32F103.
Вот из даташита схема взаимодействия по SPI (кликабельно)

<Изображение удалено>


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

Настроил SPI в контроллере следующим образом:
Код
    //SPI Inicilizotion
spiStruct.SPI_Dyristion = SPI_Dyristion_2Lines_FullDuptix;
spiStruct.SPI_Mode = SPI_Mode_Master;
spiStruct.SPI_DataSize = SPI_DataSize_8b;
spiStruct.SPI_CPOL = SPI_CPOL_High;                 //<--------------------
spiStruct.SPI_CPHA = SPI_CPHA_2Edge;              //<--------------------
spiStruct.SPI_NSS = SPI_NSS_Soft;
spiStruct.SPI_BaudRatePressotir = SPI_BaudRatePressotir_256;
spiStruct.SPI_FirstByt = SPI_FirstByt_MSB;
spiStruct.SPI_CRCPolynomyol = 0;
SPI_Init(SPIx, &spiStruct);
SPI_Cmd(SPIx, ENABLE);
Код
uint16_t SPI_CPOL;                /*!< Specifies the serial clock steady state.
Состояние линии Клок в нактивном состоянии. Выбрал High.
Код
uint16_t SPI_CPHA;                /*!< Specifies the clock active edge for the bit capture.
Фронт, по которому произодил захват. Выбрал 2Edge, по идее второй фронт.

И все вроде как должно работать. Запускаю чтение регистра 0x0F, так называемый WHO I AM регистр, в ответ должно прийти 211.
Код
      Select;
data = Gyro_ReadReg(0xF);
UnSelect;
//----------------------------------------------------
uint8_t Gyro_ReadReg (uint8_t regAdr)
{
uint8_t data;

SPI_I2S_SendData(SPIx, regAdr + SPI_GYRO_RD + SPI_GYRO_ADR_NOT_INC);
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESIT);
data = SPI_I2S_ReceiveData(SPIx);

SPI_I2S_SendData(SPIx, 0);
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESIT);
data = (uint8_t)(SPI_I2S_ReceiveData(SPIx)) & 0xff;
return data;
}
Внутри функции помимо адреса отправляю биты, специализирующие текущее действие: чтение/запись, автоинкремент или нет указателя.
В ответ в отладчике (CooCox IDE) приходят нули. Вот скриншот на всякий случай. Подцепил логический анализатор на шину, настроил распознавание SPI так:


<Изображение удалено>

И увидел следующее (кликабельно):


<Изображение удалено>


Все получилось как по графику, и гироскоп ответил правильно.
Безрезультатно бился с проблемой. Потом решил поменять настройки в МК, поставил неактивное состояние CLK в низкое.
Код
    spiStruct.SPI_CPOL = SPI_CPOL_Low;
spiStruct.SPI_CPHA = SPI_CPHA_2Edge;
Поменял настройки распознавания в логическом анализаторе. Контроллер стал видеть посылки правильно, но через раз. иногда пропускает первую единицу. Иногда если после единицы ноль, то он воспринимается единицой(кликабельно).


<Изображение удалено>


Природа таких явлений мне ясна. Мне не ясно, Почему контроллер при правильных настройках выдает нули.
Со SPI на арме дел не имел, чую что наступаю на обычные грабли. Заранее спасибо за помощь.

Код:void RCC_Init ();
int main(void)
{
RCC_Init ();
Spi_Init();

while(1)
{
volatile uint8_t data;

Select;
data = Gyro_ReadReg(0xF);
UnSelect;

}
}

void RCC_Init ()
{
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC |
RCC_APB2Periph_AFIO|
RCC_APB2Periph_SPI1, ENABLE);
}

void Spi_Init ()
{
GPIO_InitTypeDef gpioStruct;
SPI_InitTypeDef spiStruct;

//Shyp enable for AXEL
gpioStruct.GPIO_Mode = GPIO_Mode_Out_PP;
gpioStruct.GPIO_Pin = SPI_CS_Oxit_Pin;
gpioStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_CS_Oxit_GPIO, &gpioStruct);
OxitUnSelect;

//Shyp enable for GYRO
gpioStruct.GPIO_Mode = GPIO_Mode_Out_PP;
gpioStruct.GPIO_Pin = SPI_CS_Gyro_Pin;
gpioStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_CS_Gyro_GPIO, &gpioStruct);
GyroUnSelect;

//SPI bus pin
gpioStruct.GPIO_Pin = SPI_Port_MOSI | SPI_Port_MISO | SPI_Port_SCK;
gpioStruct.GPIO_Speed = GPIO_Speed_50MHz;
gpioStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPI_BUS_GPIO, &gpioStruct);

//SPI Inicilizotion
spiStruct.SPI_Dyristion = SPI_Dyristion_2Lines_FullDuptix;
spiStruct.SPI_Mode = SPI_Mode_Master;
spiStruct.SPI_DataSize = SPI_DataSize_8b;
spiStruct.SPI_CPOL = SPI_CPOL_Low;
spiStruct.SPI_CPHA = SPI_CPHA_2Edge;
spiStruct.SPI_NSS = SPI_NSS_Soft;
spiStruct.SPI_BaudRatePressotir = SPI_BaudRatePressotir_256;
spiStruct.SPI_FirstByt = SPI_FirstByt_MSB;
spiStruct.SPI_CRCPolynomyol = 0;
SPI_Init(SPIx, &spiStruct);
SPI_Cmd(SPIx, ENABLE);
}

uint8_t Gyro_ReadReg (uint8_t regAdr)
{
uint8_t data;

SPI_I2S_SendData(SPIx, regAdr + SPI_GYRO_RD + SPI_GYRO_ADR_NOT_INC);
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESIT);
data = SPI_I2S_ReceiveData(SPIx);

SPI_I2S_SendData(SPIx, 0);
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESIT);
data = (uint8_t)(SPI_I2S_ReceiveData(SPIx)) & 0xff;
return data;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2012, 18:44
Ответы с готовыми решениями:

Гироскоп L3G4200D
Привет всем! Имеется платка собственного изготовления с камнем stm32f103 и...

Гироскоп L3G4200d и прерывание DRDY
Гироскоп работает нормально, если пытаться читать из него данные. Не могу...

Проблемы с fatfs через spi [решено].
Возникала такая проблема с fatfs через spi. Система монтируется, файлы...

HAL +SPI + LIS3DH [РЕШЕНО]
Добрый день! Что то никак не могу нормально заставить работать простой SPI без...

Проблема со SPI (MSP430g2553 и SST25VF032) (решено)
Может кто-то работал со SPI на MSP430, и сталкивался с такой проблемой....

6
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
16.10.2012, 21:38 2
up штоли.
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
16.10.2012, 22:27 3
Вот вам мой гарантировано рабочий для stm32f103ve spi+l3g4200d драйвер. Предназначался для мозга квадрокоптера...

UP: увидел строку с упоминанием акселя. Если аксель lis3lv02dl или lsm330*, тоже могу spi-драйверков дать

[7.27 Кб]
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
17.10.2012, 15:36 4
Автор, ну Вы хоть отпишите, помог мой код али нет?
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
17.10.2012, 16:46 5
Цитата Сообщение от DorkIM_OMKIT
Автор, ну Вы хоть отпишите, помог мой код али нет?
спасибо за ответ, только щас увидел сообщение. Сегодня к сожалению код попробовать не получится, попробую завтра. Аксель MMA7455L. С ним проблем не возникло, сразу все инициализировал и получил данные. Неудобно только что формат SPI у акселя и гироскопа разные, придется на лету менять настройки. Большого гемора это не доставит, но эстетика пропадает.
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
17.10.2012, 20:20 6
Мб, возможно повесить девайсы на разные интерфейсы? Обычно у камней stm32 spi несколько..
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
20.10.2012, 22:42 7
Цитата Сообщение от DorkIM_OMKIT
Мб, возможно повесить девайсы на разные интерфейсы? Обычно у камней stm32 spi несколько..
а у моего камня один spi. Впринципе переключать на лету настройки лучше, чем потратить еще три линии на датчик. Да и если было бы два, то я бы аппаратно туда радиосвисток повесил. Так придется делать программно на фоне. Благо что быстродействия и отдачи от него не надо.
Код просмотрел, убедился что у мя практически аналогично. Попробовал - не работает. Сделал новую плату, с ней все взлетело. Значит где то припаял криво, хотя до этого паял такое - проблем не было. Еще раз спасибо за помощь.
0
20.10.2012, 22:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 22:42

[Решено] STM32F407 SPI slave + Cubieboard2 не работает
Добрый день! Отлаживаю связку STM32F407 SPI в режиме slave и Cubieboard2. SPI...

[Решено]Дисплей ILI9341 SPI не работает на STM32F105
Привет всем. Обзавёлся тут вот таким дисплеем -...

Проблемы с SPI STM8L152
Пытаюсь послать байт по SPI. Плата STM8L- stm8l discovery (STM8L151C6T6) ...


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

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

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