реклама на сайте
подробности

 
 
> Чтение STM32 из M25P64 по SPI при участии DMA, Как это правильно организовать?
011119xx
сообщение May 11 2011, 08:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Собственно говоря, что хочется понятно из названия темы. Уточню лишь, что хочу использовать SPI1 и судя по всему DMA1. В библиотеке периферии есть пример: SPI_RAM, но в нем используется 2 SPI, а мне бы только один хотелось. Как бы это сделать? Мои измышления привели к следующему порядку:
CODE
...
/* SPI_MASTER configuration ------------------------------------------------*/
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_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = CRCPolynomial;
SPI_Init(SPI_MASTER, &SPI_InitStructure);

/* SPI_MASTER_Rx_DMA_Channel configuration ---------------------------------*/
DMA_DeInit(SPI_MASTER_Rx_DMA_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI_MASTER_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI_MASTER_Buffer_Rx;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SPI_MASTER_Rx_DMA_Channel, &DMA_InitStructure);

/* SPI_MASTER_Tx_DMA_Channel configuration ---------------------------------*/
DMA_DeInit(SPI_MASTER_Tx_DMA_Channel);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI_MASTER_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI_MASTER_Buffer_Tx;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_Init(SPI_MASTER_Tx_DMA_Channel, &DMA_InitStructure);

/* Enable SPI_MASTER DMA Tx request */
SPI_I2S_DMACmd(SPI_MASTER, SPI_I2S_DMAReq_Tx, ENABLE);
/* Enable SPI_MASTER DMA Rx request */
SPI_I2S_DMACmd(SPI_MASTER, SPI_I2S_DMAReq_Rx, ENABLE);

/* Enable SPI_MASTER CRC calculation */
SPI_CalculateCRC(SPI_MASTER, ENABLE);

/* Enable SPI_MASTER */
SPI_Cmd(SPI_MASTER, ENABLE);

/* Enable DMA channels */
DMA_Cmd(SPI_MASTER_Rx_DMA_Channel, ENABLE);
DMA_Cmd(SPI_MASTER_Tx_DMA_Channel, ENABLE);

/* Transfer complete */
while(!DMA_GetFlagStatus(SPI_MASTER_Rx_DMA_FLAG));
while(!DMA_GetFlagStatus(SPI_MASTER_Tx_DMA_FLAG));

... а что дальше?


Сообщение отредактировал IgorKossak - Feb 1 2012, 11:56
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Valentin-k
сообщение Feb 3 2012, 05:12
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 27-01-12
Пользователь №: 69 923



Цитата(011119xx @ Feb 3 2012, 08:55) *
Рекомендую проверить состояние битов защиты секторов от записи. Если как вы говорите запись происходит очень быстро, то она просто не происходит по причине защиты от записи. Перед записью новых данных, старые все же надо сначала стирать, иначе потом при чтении получите данные отличные от записываемых.


я провожу очистку сектора.но тут дело даже не в защитных битах-запись просто через spi проходит нормально,и чтение этой записи через dma успешное,массивы совпадают,а вот запись через dma-нет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   Чтение STM32 из M25P64 по SPI при участии DMA   May 11 2011, 08:03
- - akimych   В примере 2 SPI используюются, т.к. они гоняют бай...   May 11 2011, 21:45
- - ISK2010   А я делаю так: 1) В фоне отправляю команду флэшке,...   May 13 2011, 04:13
- - 011119xx   А на код можно посмотреть?   May 13 2011, 05:37
- - Valentin-k   а можно вопрос по теме!я вообще с флешками до ...   Jan 31 2012, 17:04
|- - Danis   Цитата(Valentin-k @ Jan 31 2012, 21...   Jan 31 2012, 17:33
|- - DmitryM   Цитата(Valentin-k @ Jan 31 2012, 20...   Jan 31 2012, 18:36
- - Valentin-k   спасибо за разъяснение но маленькое уточнение, не ...   Jan 31 2012, 19:02
|- - DmitryM   Цитата(Valentin-k @ Jan 31 2012, 22...   Feb 1 2012, 03:46
|- - Danis   Цитата(Valentin-k @ Jan 31 2012, 23...   Feb 1 2012, 09:47
- - Valentin-k   осциллографом на шинах miso или mosi и clk.я через...   Feb 1 2012, 10:28
- - Valentin-k   снова вопрос:а может флешка не успеть сохранить? д...   Feb 2 2012, 11:48
- - Valentin-k   задам вопрос по другому! вот написан модуль у ...   Feb 2 2012, 15:03
- - 011119xx   Рекомендую проверить состояние битов защиты сектор...   Feb 3 2012, 04:55
|- - Genadi Zawidowski   Цитата(Valentin-k @ Feb 3 2012, 09:1...   Feb 3 2012, 05:33
- - Valentin-k   я нули шлю,при чтении нужно тактирование делать,ну...   Feb 3 2012, 05:41
|- - DmitryM   Цитата(Valentin-k @ Feb 3 2012, 08:4...   Feb 3 2012, 08:44
- - Valentin-k   про команду я знаю и сейчас уже локализовался - по...   Feb 3 2012, 08:49
- - 011119xx   А канал DMA перестраивается или нет при попытке ус...   Feb 6 2012, 05:03
- - Valentin-k   в каком смысле перестраивается? я с битом разобрал...   Feb 6 2012, 20:22
- - Valentin-k   а может дело в флагах которые ставит дма,а я не сб...   Feb 7 2012, 07:34
- - smalcom   Плохо смотрю или Valentin-k действительно не прове...   Feb 25 2012, 08:17


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th August 2025 - 19:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016