реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы с приемом данных по SPI на STM32F4 Discovery
codebreaker7
сообщение Oct 15 2013, 07:47
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Пытаюсь получить данные с другого устройства по SPI на STM32F4 Discovery. Для начала отправляю по 1 байту. Первый приходит нормально, следующие - неправильно. Причем полученные данные выглядят следующим образом: для 1 - 0x81, для 0x47 - 0xC7, т.е. появляется 1 в начале. Результат приема смотрю в DMA. При попытке передать большее количество байт видно, что не все приходит, например, передано 10 байт, а в памяти только 6 или 7.
Передача ведется на частоте 1 МГц.

CODE
void init(void) {
GPIO_InitTypeDef gpio_init;
SPI_InitTypeDef spi_init;
DMA_InitTypeDef dma_init;
NVIC_InitTypeDef nvic_init;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
gpio_init.GPIO_Mode = GPIO_Mode_AF;
gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_init.GPIO_OType = GPIO_OType_PP;
gpio_init.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &gpio_init);

gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS
GPIO_Init(GPIOB, &gpio_init);

nvic_init.NVIC_IRQChannel = SPI2_IRQn;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
nvic_init.NVIC_IRQChannelSubPriority = 1;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&nvic_init);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
SPI_StructInit(&spi_init);
spi_init.SPI_Mode = SPI_Mode_Slave;
spi_init.SPI_CPHA = SPI_CPHA_1Edge;
spi_init.SPI_CPOL = SPI_CPOL_Low;
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_init.SPI_NSS = SPI_NSS_Hard;
SPI_Init(SPI2, &spi_init);
SPI_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Reset);
SPI_Cmd(SPI2, ENABLE);

GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(DMA1_Stream3);
dma_init.DMA_Channel = DMA_Channel_0;
dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma_init.DMA_Mode = DMA_Mode_Normal;
dma_init.DMA_Priority = DMA_Priority_High;

dma_init.DMA_Memory0BaseAddr = (uint32_t)&data;
dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

dma_init.DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C);
dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Init(DMA1_Stream3, &dma_init);
DMA_Cmd(DMA1_Stream3, ENABLE);
}


В чем может быть ошибка?

Сообщение отредактировал IgorKossak - Oct 15 2013, 13:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Oct 15 2013, 13:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(codebreaker7 @ Oct 15 2013, 11:47) *
В чем может быть ошибка?

NSS у Вас аппаратный?
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 15 2013, 13:38
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Цитата(adnega @ Oct 15 2013, 16:22) *
NSS у Вас аппаратный?

По идее, да, т.к. на мастере я только передаю данные. Это я так понял. Может в этом направлении и искать?
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 17 2013, 11:56
Сообщение #4





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Извиняюсь за скудность описанной вначале информации: изначально думал, что проблема именно здесь. Добавлю еще по поводу передающего устройства. Используется FT2232H Mini Module, который переводится в режим MPSSE для передачи по SPI. Процедура перехода в данный режим стандартная и сопровождается включением режима loopback - все отрабатывает нормально - и его отключением. Выставляется предделитель, чтобы частота передачи была 1 МГц и насстраиваются пины. Насчет конфигураций выходов (т.е. по назначению вход/выход), то пробовал разные варианты для CS: в одном случае передача не идет, в другом - выявляются описанные выше проблемы.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Oct 17 2013, 19:03
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(codebreaker7 @ Oct 17 2013, 14:56) *
Извиняюсь за скудность описанной вначале информации: изначально думал, что проблема именно здесь. Добавлю еще по поводу передающего устройства. Используется FT2232H Mini Module, который переводится в режим MPSSE для передачи по SPI. Процедура перехода в данный режим стандартная и сопровождается включением режима loopback - все отрабатывает нормально - и его отключением. Выставляется предделитель, чтобы частота передачи была 1 МГц и насстраиваются пины. Насчет конфигураций выходов (т.е. по назначению вход/выход), то пробовал разные варианты для CS: в одном случае передача не идет, в другом - выявляются описанные выше проблемы.

Вы уверены что проблема с приемом данных по SPI на STM32F4 Discovery, может программа на ПК не корректно работает с FT2232H Mini Module?


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
RuSTA
сообщение Oct 21 2013, 07:38
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-10-10
Из: Россия
Пользователь №: 60 410



codebreaker7, проверти скорость соединения микросхемы FT и компьютера.
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 22 2013, 16:51
Сообщение #7





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



С начальной проблемой разобрался: код из примера для FTDI работал так, что начальный уровень CLK выставлялся в 1, а на плате ожидался совсем другой режим, когда CLK работает с 0. Поменяв CPOL с Low на High, получил нормальный прием. Но появилась вторая проблема: когда я хочу передать данные, задав низкий начальный уровень сигнала CLK на FTDI, я получаю следующий результат.
передаю - 0x47, 0x48, 0xaa
получаю - 0x23, 0xa4, 0x55
Если посмотреть двоичный код, то видно, что в начале посылки появился 0, а дальше все записывается нормально. Непонятно, откуда берется этот 0. На STM32F4 Discovery устанавливаю параметры для приема в режиме SPI 0 - CPOL_Low, CPHA_1Edge.

Цитата(RuSTA @ Oct 21 2013, 10:38) *
codebreaker7, проверти скорость соединения микросхемы FT и компьютера.

как это можно сделать?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 22 2013, 16:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну полярность клока выбрали,
теперь фронт защелки покрутите...
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 22 2013, 17:08
Сообщение #9





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Цитата(Golikov A. @ Oct 22 2013, 19:51) *
ну полярность клока выбрали,
теперь фронт защелки покрутите...

при параметре CPHA_1Edge данные принимаются как описано выше, при параметре CPHA_2Edge первая посылка принимается нормально, а дальше данные идут неправильно. Точнее все происходит следующим образом: с ПК запускается программа, переводящая в режим SPI и отправляющая пакет - результат наблюдается в памяти, он правильный, по завершении программа выходит из режима SPI; следующие принятые данные некорректны. Но проблема еще в том, что в доках на FTDI написано, что в режиме работы с SPI (MPSSE) доступны только режимы 0 и 2. А если выставляем CPHA_2Edge, то это SPI mode 1.

Сообщение отредактировал codebreaker7 - Oct 22 2013, 17:09
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 22 2013, 21:01
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а нельзя осциллографом поглядеть на картинку что с данными, и сравнить с картинками из доки. Я никогда не мог по цифоркам выбрать нужные режим...
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 23 2013, 17:58
Сообщение #11





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Проблема передачи для SPI mode 0 решилась следующим образом: вначале устанавливается высокий уровень сигнала SS на FT2232, перед передачей он переводится в 0 и сразу же записываются данные. Сработало для нескольких устройств.
Go to the top of the page
 
+Quote Post
etoja
сообщение Oct 29 2013, 14:59
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



NSS, то есть чип селект SPI-слэйва, у вас определён как бит ввода-вывода:

gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS
GPIO_Init(GPIOB, &gpio_init);

Он как чип-селект не сконфигурирован.
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Oct 30 2013, 10:15
Сообщение #13





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Цитата(etoja @ Oct 29 2013, 17:59) *
NSS, то есть чип селект SPI-слэйва, у вас определён как бит ввода-вывода:

gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS
GPIO_Init(GPIOB, &gpio_init);

Он как чип-селект не сконфигурирован.


Режим работы указывается с помощью GPIO_Mode_AF. Далее функцией Gpio_PinAFConfig() указываем, к какой именно функции нужно подключиться. Поэтому, как мне кажется, все правильно.
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Nov 4 2013, 04:55
Сообщение #14





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Все-таки проблема с Mode 0 никуда не делась: при передаче относительно больших посылок данные идут неправильно. Типичный случай: передается посылка из 64 байт часть доходит нормально, а потом начинается прием непонятно чего. В чем еще может быть проблема в таком случае? Интересно, что в SPI Mode 2 удается принимать безошибочно намного большие объемы данных.
Go to the top of the page
 
+Quote Post
codebreaker7
сообщение Jan 4 2014, 07:13
Сообщение #15





Группа: Участник
Сообщений: 10
Регистрация: 14-10-13
Пользователь №: 78 732



Для большей ясности картины изображения, из которых видно, что при одиночной передаче символа все идет нормально:
Прикрепленное изображение

При последующей попытке передачи файла (файл заполнен буквами G - 1024 буквы):
Прикрепленное изображение

Видно, что в начале все передается хорошо, а потом происходит сбой и данные передаются неправильно. Может кто-то сталкивался с подобным. Режим SPI - SPI Mode 0.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016