Jump to content

    

stm32 spi+dma

Очень странную дичь я исследую сегодня. Возможно опять моя криворукость даёт о себе знать.

Поднят spi(он рабочий) и dma. И при пересылке данных через dma в spi, а в частности пересылке 256 байт данных, выходит такая картина: 195 байт проходят нормально, остаток какая то ересь. У меня IAR и в процессе всяческих манипуляций я понял, что это как то связано с дебагером, потому как, если остановиться на функции пересылки и нажать "Go"(f5), то собственно 195 байт нормально, остальные ересь, а, если же остановиться на функции и нажать "Step Over" (f10), то (о Боги) всё работает адекватно. Дебагер j-link-arm, интерфейс SWD.

Share this post


Link to post
Share on other sites
это как то связано с дебагером

Отладчик может читать регистры. Флаги могут сбрасываться от чтения. Сброс флагов может влиять на работу периферийных блоков.

Share this post


Link to post
Share on other sites

Я даже представления не имею какие флаги могут сброситься, что может произойти в момент передачи, что данные пойдут в регистр совсем левые. Какие флаги DMA влияют на передаваемый из памяти данные в периферию? я не понимаю.

Если вопрос не будет решен, я забью *** и буду делать по 128 байт. Надежнее. Сыт уже второй день хлебать эту дичь.

Share this post


Link to post
Share on other sites
Сыт уже второй день хлебать эту дичь.

А камушек какой? Не из F3, случайно?

Share this post


Link to post
Share on other sites
А камушек какой? Не из F3, случайно?

так нет же, у меня f105. У вас ведь есть какой то опыт с этой проблемой или есть варианты, которые могут решить данную проблему?

Edited by Still Enemy

Share this post


Link to post
Share on other sites

Возможно проблема в том, что почему-то SPI нужна какая-то предварительная задержка перед отправкой, что собственно отладчик и делает.

Share this post


Link to post
Share on other sites
или есть варианты, которые могут решить данную проблему?

Нужно все грамотно инициализировать:

1. Сбросить SPI_CR2_TXDMAEN;

2. Сбросить флаги соответствующего канала DMA и запретить этот канал;

3. Настроить канал DMA и разрешить этот канал;

4. Установить SPI_CR2_TXDMAEN.

 

После этого с небольшой задержкой (тактов 12) DMA начнет записывать значения в SPI.

У меня на F100 и F407 выводятся до 1024 байт без каких-либо проблем.

Share this post


Link to post
Share on other sites
У вас ведь есть какой то опыт с этой проблемой или есть варианты, которые могут решить данную проблему?

Я делаю вот так. Работает как часы.

Share this post


Link to post
Share on other sites
После этого с небольшой задержкой (тактов 12) DMA начнет записывать значения в SPI.

У меня на F100 и F407 выводятся до 1024 байт без каких-либо проблем.

Пасибо большое, вот этот совет частично помог. Поставил задержку(2 мс) после запуска dma и убрал флаг Half transfer complete и всё заработало. Мне всё равно не пригодится этот флаг, я же не по Мбайту передаю, а по 256 байт всего.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this