|
Чтение STM32 из M25P64 по SPI при участии DMA, Как это правильно организовать? |
|
|
|
May 11 2011, 08:03
|

Местный
  
Группа: Свой
Сообщений: 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]
|
|
|
|
|
 |
Ответов
|
Feb 3 2012, 05:41
|
Участник

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

|
я нули шлю,при чтении нужно тактирование делать,нулями и делаю. массив buffSPI_Tx у меня нулевой,только в его нулевой элемент записываю команду на чтение READ,а три следующие адрес,в данном случае нулевой.далее указываю буффер приема и передачи и включаю два канала... по завершению передачи в buffSPI_Rx я имею страницу считанную из флеша(за исключением последних 4 байт,но это мелочь,буффер увеличить на 4 и всю страницу получу или както по другому-это не важно)-это все работает!проблема с записью...чую где то глупый косяк,да опыта мало еще с 32-х разрядными
Сообщение отредактировал Valentin-k - Feb 3 2012, 05:46
|
|
|
|
|
Feb 3 2012, 08:44
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(Valentin-k @ Feb 3 2012, 08:41)  проблема с записью...чую где то глупый косяк,да опыта мало еще с 32-х разрядными Ну вот, оказывается таки проблема с записью. А Вы учитываете что перед каждой записью нужно дать команду WREN и контроллировать WEL? The Write Enable Latch (WEL) bit must be set prior to every Page Program (PP), Sector Erase (SE), Bulk Erase (BE) and Write Status Register (WRSR) instruction.
|
|
|
|
Сообщений в этой теме
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 Valentin-k Цитата(011119xx @ Feb 3 2012, 08:55) Реко... Feb 3 2012, 05:12 Genadi Zawidowski Цитата(Valentin-k @ Feb 3 2012, 09:1... Feb 3 2012, 05:33 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|