|
Переход с STM32F10x на STM32F4xx, Проблемы с SPI |
|
|
|
Feb 13 2017, 19:10
|
Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
|
Feb 13 2017, 20:50
|
Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785

|
Цитата(Genadi Zawidowski @ Feb 13 2017, 23:27)  А можете уточнить, что подразумевается под словом "вылетает"? Если проходить программу по шагам то после прохождения циклов for в обеих функциях, программа переходит в Default handler, который является пустым бесконечным циклом.
|
|
|
|
|
Feb 13 2017, 23:06
|
Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785

|
Цитата(Genadi Zawidowski @ Feb 14 2017, 01:00)  Тогда покажите что за буферы передаются в Ваши функции. Попробуйте читать регистры, но не писать в память - что изменится в "вылете". Буфера генерируются функциями более высокого уровня, вот пример значения буферов при попытки записи конфигураций в модуль. Я проверял, значения этих буферов совпадает со значениями в исходном проекте для F105RC. В случае если убрать из функций операции записи в регистры, то у функции чтения не устанавливается флаг и программа стоит на шаге проверки флага, а у функции записи вылетает следующая ошибка, (при условии что я правильно понял то, что вы попросили сделать), но в default handler не залетает.
Сообщение отредактировал Diman142 - Feb 13 2017, 23:08
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 13 2017, 23:32
|
Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785

|
Цитата(Genadi Zawidowski @ Feb 14 2017, 02:09)  Я же сказал про то что из регистра читать, в память не писать Прошу прощения за глупый вопрос. Я не до конца понимаю, читать из регистра DR, но не записывать его данные в буфера??
|
|
|
|
|
Feb 14 2017, 10:13
|

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

|
было Код readBuffer[i] = SPIx->DR; стало Код SPIx->DR; или стало Код (void) SPIx->DR;
|
|
|
|
|
Feb 14 2017, 11:16
|
Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785

|
Цитата(Genadi Zawidowski @ Feb 14 2017, 13:13)  было Код readBuffer[i] = SPIx->DR; стало Код SPIx->DR; или стало Код (void) SPIx->DR; Спасибо за пояснение. Сделал, как вы сказали программа программа выдает ошибку, (ошибка на скрине). Ошибка появляется на шаге проверки флага. Код while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 14 2017, 11:26
|
Группа: Участник
Сообщений: 11
Регистрация: 16-10-16
Пользователь №: 93 785

|
Если убрать шаг проверки флага, то программа не вылетает в default handler и нормально проходит. Цитата(Genadi Zawidowski @ Feb 14 2017, 14:19)  По дебаговской диагностике не подскажу. sorry. А может есть пример для записи в буфера данных с spi для серии F4? Если чтение и проверку флага оставить а каким-то образом изменить вот эту строчку? Код readBuffer[i] = SPIx->DR;
|
|
|
|
|
Feb 14 2017, 11:48
|
Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
|
Feb 14 2017, 13:10
|
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|