Перейти к содержанию
    

Diman142

Участник
  • Постов

    11
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Приветствую, коллеги. Начинаю разбираться с nrf51822. На первом этапе у меня был модуль NRF51822, на котором помимо самого чипа заведено 2 кварца 16МГц и 32КГц, сделал прошивку в хидере, nrf_drv_config.h указал соответственно. #define CLOCK_CONFIG_XTAL_FREQ NRF_CLOCK_XTALFREQ_Default #define CLOCK_CONFIG_LF_SRC NRF_CLOCK_LF_SRC_Xtal #define CLOCK_CONFIG_LF_RC_CAL_INTERVAL RC_2000MS_CALIBRATION_INTERVAL #define CLOCK_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW И всё нормально заработало модуль виден в эфире прошивка тоже отрабатывает. На платке нет внешнего 32КГц кварца, соответственно для теста я не использую никакие алгортимы калибровки и.т.д и указал просто. #define CLOCK_CONFIG_LF_SRC NRF_CLOCK_LF_SRC_RC #define CLOCK_CONFIG_LF_RC_CAL_INTERVAL RC_2000MS_CALIBRATION_INTERVAL #define CLOCK_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW Но почему-то не вижу её в эфире, может быть при такой конфигурации нужно нужно что-то добавить в main.c или есть ещё какие-то особенности при переходе с модуля на реальную плату? Также на реальной плате есть внешний кварц на 16МГц, я пытался как-то задействовать его добавляя строчки, конденсаторы подобраны правильно, я это проверил. #define CLOCK_CONFIG_XTAL_FREQ NRF_CLOCK_XTALFREQ_Default и #define CLOCK_CONFIG_XTAL_FREQ NRF_CLOCK_XTALFREQ_16MHz но это не дало результатов. Чипы соответственно на модуле: N51822 QFACA1 1550GX А на плате: N51822 QFACA1 1610AP Спасибо за ваши ответы)
  2. PP - это push Pull Miso как Input это в серии F10x, А для F4xx вроде нужно конфигурить, как AF, по крайней мере так во всех примерах.
  3. В запуске 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
  4. Да действительно были разрешены прерывания, от 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; }
  5. Если убрать шаг проверки флага, то программа не вылетает в default handler и нормально проходит. А может есть пример для записи в буфера данных с spi для серии F4? Если чтение и проверку флага оставить а каким-то образом изменить вот эту строчку? readBuffer[i] = SPIx->DR;
  6. Спасибо за пояснение. Сделал, как вы сказали программа программа выдает ошибку, (ошибка на скрине). Ошибка появляется на шаге проверки флага. while((SPIx->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
  7. Прошу прощения за глупый вопрос. Я не до конца понимаю, читать из регистра DR, но не записывать его данные в буфера??
  8. Буфера генерируются функциями более высокого уровня, вот пример значения буферов при попытки записи конфигураций в модуль. Я проверял, значения этих буферов совпадает со значениями в исходном проекте для F105RC. В случае если убрать из функций операции записи в регистры, то у функции чтения не устанавливается флаг и программа стоит на шаге проверки флага, а у функции записи вылетает следующая ошибка, (при условии что я правильно понял то, что вы попросили сделать), но в default handler не залетает.
  9. Если проходить программу по шагам то после прохождения циклов for в обеих функциях, программа переходит в Default handler, который является пустым бесконечным циклом.
  10. Переход с STM32F10x на STM32F4xx

    Приветствую коллеги, я начинающий разработчик и волею судеб столкнулся с семейством МК 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. И что нужно изменить в этих функциях, чтобы они заработали на моем микроконтроллере, Заранее спасибо.
  11. Всем доброго времени суток.) Дело вот в чем, возникла необходимость разобраться в среде разработки coocox, на данной стадии нужно загрузить готовую прошивку в микроконтроллер. Я установил среду подключил Toolchain. В настройках указал свой программатор. Проект компилится, с этим всё нормально. После компиляции нажимаю кнопку debug идут какие-то процессы и в итоге открывается окно, где написано следующее: Can't find a source file at "f:\\357\360\356\343\360\340\354\354\373\decawave\dw1000_api_rev2p02\examples\ex_01a_simple_tx\main.c" Locate the file or edit the source lookup path to include its location. Может быть кто-нибудь сталкивался с подобным и подскажет какую галочку я не нажал или в чем суть этой ошибки и на что она влияет?
×
×
  • Создать...