Diman142 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 (изменено) · Жалоба Приветствую коллеги, я начинающий разработчик и волею судеб столкнулся с семейством МК STM32. Нужно было переписать проект для STM32F105RC на STM32F407VG. Соответственно пришлось переписывать некоторые функции в проекте связанные с периферией. Камнем преткновения стали функции чтения и записи SPI. В исходном проекте для F105RC она имеют следующий вид: 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; } и соответственно 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. И что нужно изменить в этих функциях, чтобы они заработали на моем микроконтроллере, Заранее спасибо. Изменено 13 февраля, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба А можете уточнить, что подразумевается под словом "вылетает"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба А можете уточнить, что подразумевается под словом "вылетает"? Если проходить программу по шагам то после прохождения циклов for в обеих функциях, программа переходит в Default handler, который является пустым бесконечным циклом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба Тогда покажите что за буферы передаются в Ваши функции. Попробуйте читать регистры, но не писать в память - что изменится в "вылете". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 (изменено) · Жалоба Тогда покажите что за буферы передаются в Ваши функции. Попробуйте читать регистры, но не писать в память - что изменится в "вылете". Буфера генерируются функциями более высокого уровня, вот пример значения буферов при попытки записи конфигураций в модуль. Я проверял, значения этих буферов совпадает со значениями в исходном проекте для F105RC. В случае если убрать из функций операции записи в регистры, то у функции чтения не устанавливается флаг и программа стоит на шаге проверки флага, а у функции записи вылетает следующая ошибка, (при условии что я правильно понял то, что вы попросили сделать), но в default handler не залетает. Изменено 13 февраля, 2017 пользователем Diman142 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба Я же сказал про то что из регистра читать, в память не писать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба Я же сказал про то что из регистра читать, в память не писать Прошу прощения за глупый вопрос. Я не до конца понимаю, читать из регистра DR, но не записывать его данные в буфера?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба было readBuffer[i] = SPIx->DR; стало SPIx->DR; или стало (void) SPIx->DR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба было readBuffer[i] = SPIx->DR; стало SPIx->DR; или стало (void) SPIx->DR; Спасибо за пояснение. Сделал, как вы сказали программа программа выдает ошибку, (ошибка на скрине). Ошибка появляется на шаге проверки флага. while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба По дебаговской диагностике не подскажу. sorry. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба Если убрать шаг проверки флага, то программа не вылетает в default handler и нормально проходит. По дебаговской диагностике не подскажу. sorry. А может есть пример для записи в буфера данных с spi для серии F4? Если чтение и проверку флага оставить а каким-то образом изменить вот эту строчку? readBuffer[i] = SPIx->DR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 (изменено) · Жалоба Пора смотреть на инициализацию, нет ли разрешения прерываний от этого устройства. Да действительно были разрешены прерывания, от SPI1, я убрал это дело и повторил то, что вы попросили сделать, при запрете прерывания программа проходит циклы for и также вылетает в default handler, вот инициализация на всякий случай. 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; } Изменено 14 февраля, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба А где вы указываете какой именно SPI ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diman142 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба А где вы указываете какой именно 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться