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

 
 
> Переход с STM32F10x на STM32F4xx, Проблемы с SPI
Diman142
сообщение Feb 13 2017, 19:10
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785



Приветствую коллеги, я начинающий разработчик и волею судеб столкнулся с семейством МК STM32.
Нужно было переписать проект для STM32F105RC на STM32F407VG. Соответственно пришлось переписывать некоторые функции в проекте связанные с периферией. Камнем преткновения стали функции чтения и записи SPI. В исходном проекте для F105RC она имеют следующий вид:

CODE
int readfromspi(uint16 headerLength, const uint8 *headerBuffer, uint32 readlength, uint8 *readBuffer)
{

int i=0;

GPIO_ResetBits(SPIx_CS_GPIO, SPIx_CS);

for(i=0; i<headerLength; i++)
{
SPIx->DR = headerBuffer[i];

while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

readBuffer[0] = SPIx->DR ;
}

for(i=0; i<readlength; i++)
{
SPIx->DR = 0;

while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

readBuffer[i] = SPIx->DR ;
}

GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

return 0;
}

и соответственно

CODE
int writetospi(uint16 headerLength, const uint8 *headerBuffer, uint32 bodylength, const uint8 *bodyBuffer)
{

int i=0;

GPIO_ResetBits(SPIx_CS_GPIO, SPIx_CS);

for(i=0; i<headerLength; i++)
{
SPIx->DR = headerBuffer[i];

while ((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

SPIx->DR;
}

for(i=0; i<bodylength; i++)
{
SPIx->DR = bodyBuffer[i];

while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);

SPIx->DR ;
}

GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

return 0;
}


Все необходимые definы я сделал программа компилируется, но вылетает после операции чтения или записи.
Помогите пожалуйста понять, почему данные функции не отрабатывают на STM32F407VG.
И что нужно изменить в этих функциях, чтобы они заработали на моем микроконтроллере,

Заранее спасибо.

Сообщение отредактировал IgorKossak - Feb 13 2017, 19:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Feb 14 2017, 11:27
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.
Go to the top of the page
 
+Quote Post
Diman142
сообщение Feb 14 2017, 11:48
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785



Цитата(Genadi Zawidowski @ Feb 14 2017, 14:27) *
Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства.


Да действительно были разрешены прерывания, от SPI1, я убрал это дело и повторил то, что вы попросили сделать, при запрете прерывания программа проходит циклы for и также вылетает в default handler, вот инициализация на всякий случай.

CODE
int SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPIx, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

SPI_I2S_DeInit(SPIx);

// SPIx Mode setup
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPIx, &SPI_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
// SPIx SCK and MOSI pin setup

GPIO_InitStructure.GPIO_Pin = SPIx_SCK | SPIx_MOSI | SPIx_MISO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(SPIx_GPIO, &GPIO_InitStructure);

// SPIx CS pin setup
GPIO_InitStructure.GPIO_Pin = SPIx_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(SPIx_CS_GPIO, &GPIO_InitStructure);
// Disable SPIx SS Output
SPI_SSOutputCmd(SPIx, DISABLE);

// Enable SPIx
SPI_Cmd(SPIx, ENABLE);

// Set CS high
GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);

return 0;

}


Сообщение отредактировал IgorKossak - Feb 14 2017, 18:48
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Feb 14 2017, 12:04
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



А где вы указываете какой именно SPI ?
Go to the top of the page
 
+Quote Post
Diman142
сообщение Feb 14 2017, 13:10
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785



Цитата(A.Lex @ Feb 14 2017, 15:04) *
А где вы указываете какой именно SPI ?


В запуске SPI
SPIx = SPI1

Код
SPI_Cmd(SPIx, ENABLE);


Сделаны следующие операции define:

Код
#define SPIx_GPIO                    GPIOA
#define SPIx_CS                    GPIO_Pin_4
#define SPIx_CS_GPIO                GPIOA
#define SPIx_SCK                    GPIO_Pin_5
#define SPIx_MISO                    GPIO_Pin_6
#define SPIx_MOSI                    GPIO_Pin_7
#define SPIx                                             SPI1
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Feb 14 2017, 14:30
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



GPIO_OType_PP - это OUTPUT?
MISO -> INPUT
Go to the top of the page
 
+Quote Post
Diman142
сообщение Feb 14 2017, 19:03
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785



Цитата(A.Lex @ Feb 14 2017, 17:30) *
GPIO_OType_PP - это OUTPUT?
MISO -> INPUT


PP - это push Pull
Miso как Input это в серии F10x, А для F4xx вроде нужно конфигурить, как AF, по крайней мере так во всех примерах.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Diman142   Переход с STM32F10x на STM32F4xx   Feb 13 2017, 19:10
- - Genadi Zawidowski   А можете уточнить, что подразумевается под словом ...   Feb 13 2017, 20:27
|- - Diman142   Цитата(Genadi Zawidowski @ Feb 13 2017, 23...   Feb 13 2017, 20:50
- - Genadi Zawidowski   Тогда покажите что за буферы передаются в Ваши фун...   Feb 13 2017, 22:00
|- - Diman142   Цитата(Genadi Zawidowski @ Feb 14 2017, 01...   Feb 13 2017, 23:06
- - Genadi Zawidowski   Я же сказал про то что из регистра читать, в памят...   Feb 13 2017, 23:09
|- - Diman142   Цитата(Genadi Zawidowski @ Feb 14 2017, 02...   Feb 13 2017, 23:32
- - Genadi Zawidowski   было Код readBuffer[i] = SPIx->DR...   Feb 14 2017, 10:13
|- - Diman142   Цитата(Genadi Zawidowski @ Feb 14 2017, 13...   Feb 14 2017, 11:16
- - Genadi Zawidowski   По дебаговской диагностике не подскажу. sorry.   Feb 14 2017, 11:19
- - Diman142   Если убрать шаг проверки флага, то программа не в...   Feb 14 2017, 11:26


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 08:40
Рейтинг@Mail.ru


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