09.01.2013, 17:07
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от nerozero
|
Не запускается DMA для SPI, подскажите что я тут криво делаю?
|
Каюсь, виновен, читал не тот даташит! DMA 4-канал не может работать с SPI1 - TX.
|
|
|
|
10.01.2013, 01:59
|
|
Прописка
Регистрация: 19.05.2012
Сообщений: 99
Сказал спасибо: 0
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
что нужно настроить для приема блока по SPI с DMA ?
канал TX тоже нужно стартовать (то есть для приема нужно передавать 0xFF) ?
стартую только RX - принимаю одни нули.
|
|
|
|
10.01.2013, 02:06
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от polyname
|
стартую только RX - принимаю одни нули.
|
1. Проверьте канал ДМА, работает ли он с RX линией вашего SPI
2. проверьте настройки SPI, режим работы
если без дма принимается правильно - тогда канал ДМА выбран не верно. В дата шите есть таблица,сверьтесь с ней.
Для моего STM32F100:
|
|
|
|
10.01.2013, 02:27
|
|
Прописка
Регистрация: 19.05.2012
Сообщений: 99
Сказал спасибо: 0
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
если без дма принимается правильно - тогда канал ДМА выбран не верно
|
да, работает и с программным, и с аппаратным SPI. Канал вроде правильный - 2й на прием, 3й - на передачу.
Наконец удалось правильно принять 1 блок данных - запускаю оба - RX и TX.
TX настроил на передачу 0xFF без инкремента памяти.
Но передача/прием следующих блоков виснет.
настройка: http://codetidy.com/4348/
и передача/прием: http://codetidy.com/4349/
Последний раз редактировалось polyname; 10.01.2013 в 11:45.
|
|
|
|
10.01.2013, 09:36
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
polyname, какая длина вашего буфера приемника?
|
|
|
|
10.01.2013, 11:44
|
|
Прописка
Регистрация: 19.05.2012
Сообщений: 99
Сказал спасибо: 0
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
16 или 512 байт (зависит от команды чтения SD)
|
|
|
|
10.01.2013, 11:49
|
|
Прописка
Регистрация: 19.05.2012
Сообщений: 99
Сказал спасибо: 0
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
наконец удалось принять несколько блоков, если в конце приема дать команды:
Код:
|
DMA_Cmd(SPI_STM32_DMA_TX, DISABLE);
DMA_Cmd(SPI_STM32_DMA_RX, DISABLE); |
но все равно периодически виснет.
|
|
|
|
10.01.2013, 15:30
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Возможно вы не обновляете CNDTR (количество данных) регистр DMA канала. После приема / передачи его значение уменьшается, до тех пор пока не обнулится. Прочитайте Datasheet контроллера DMA.
В моем случае я делаю так, на отправку данных:
Код:
|
void DMA1_Channel3_IRQHandler()
{
//Trasmit complete
if(DMA1-›ISR & DMA_ISR_TCIF3)
{
DMA_ClearFlag(DMA1_FLAG_TC3);
// ~~~ CUT ~~~
DMA_Cmd(DTA_SPI_DMA_Tx_Channel,DISABLE); // Обратите внимание, для обновления регистра CNDTR канал ДМА должен быть отключен!
DTA_SPI_DMA_Tx_Channel-›CNDTR = DTA_BUFF_SIZE;
DMA_Cmd(DTA_SPI_DMA_Tx_Channel,ENABLE);
// ~~~ CUT ~~~
}
//Transmit half buffer - complete
if(DMA1-›ISR & DMA_ISR_HTIF3)
{
DMA_ClearFlag(DMA1_FLAG_HT3);
}
//Transmit error
if(DMA1-›ISR & DMA_ISR_TEIF3)
{
DMA_ClearFlag(DMA1_FLAG_TE3);
}
} |
|
|
|
|
10.01.2013, 15:42
|
|
Вид на жительство
Регистрация: 26.07.2007
Сообщений: 483
Сказал спасибо: 18
Сказали Спасибо 107 раз(а) в 68 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Кстати вот пример работы с SD картой через SDIO + DMA
SD_Card.rar
Автор AVRman
пришел с примерами от HY-Mini
|
|
|
|
10.01.2013, 15:42
|
|
Прописка
Регистрация: 19.05.2012
Сообщений: 99
Сказал спасибо: 0
Сказали Спасибо 10 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
Возможно вы не обновляете CNDTR (количество данных)
|
обновляю (DMA_BufferSize), в конце передачи/приема отключаю оба канала:
Код:
|
spi_dma_tx.DMA_MemoryBaseAddr = (U32)&spi_dma_tx_FF;
spi_dma_tx.DMA_BufferSize = len;
DMA_Init(SPI_STM32_DMA_TX, &spi_dma_tx);
spi_dma_rx.DMA_MemoryBaseAddr = (U32)buf;
spi_dma_rx.DMA_BufferSize = len;
DMA_Init(SPI_STM32_DMA_RX, &spi_dma_rx);
DMA_ClearFlag(SPI_STM32_DMA_RX_FLAG);
DMA_Cmd(SPI_STM32_DMA_TX, ENABLE);
DMA_Cmd(SPI_STM32_DMA_RX, ENABLE);
while(DMA_GetFlagStatus(SPI_STM32_DMA_RX_FLAG) == RESET);
DMA_Cmd(SPI_STM32_DMA_TX, DISABLE);
DMA_Cmd(SPI_STM32_DMA_RX, DISABLE);
while (SPI_I2S_GetFlagStatus(SPI_STM32, SPI_I2S_FLAG_BSY) == SET);
delay_us(10); |
Добавил проверку флага SPI_I2S_FLAG_BSY и задержку - все равно периодически виснет.
При увеличении SPI_BaudRatePrescaler - реже, но тогда в DMA нет смысла если программный опрос работает даже делителем 2х - быстрее чем с ДМА.
Последний раз редактировалось polyname; 10.01.2013 в 15:49.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:15.
|
|