pokk 0 25 марта, 2020 Опубликовано 25 марта, 2020 (изменено) · Жалоба Пишу функции для работы с памятью A25L032 на stm32f405 , с активным использование DMA. В функциях чтения/запись массива данных, разбил на 2 части Первая часть это отправка команды + адреса Вторая часть это отправка самих данных. Можно ли это как-то красиво сделать без разделения на 2 части? А сразу становить транзакцию на прием/передачу //================================================================================================== /* * @Описание: Описание функции. * @Параметр: * @Возврат: Нету */ void A25L0xx_ReadBytes(uint8_t* pBuffer, uint32_t ReadAddr, uint32_t NumByteToRead){ xSemaphoreTakeRecursive(MutexA25L0xx,portMAX_DELAY); SPI_CS_OFF(); //------------------------------------------------------------------------------- TempTransmitBuff[0]=0x03; TempTransmitBuff[1]=((ReadAddr & 0xFF0000) >> 16); TempTransmitBuff[2]=((ReadAddr & 0xFF00) >> 8); TempTransmitBuff[3]=(ReadAddr & 0xFF); //------------------------------------------------------------------------------- Send_Spi_dma(TempReceiveBuff,TempTransmitBuff,4,TYPE_TRANSMIT,USE_MINC); //------------------------------------------------------------------------------- Send_Spi_dma(pBuffer,&DUMMY,NumByteToRead,TYPE_RECEIVE,TRANSMIT_NOT_MINC); // Без инкримента данных на передачу //------------------------------------------------------------------------------- SPI_CS_ON(); xSemaphoreGiveRecursive(MutexA25L0xx); } Изменено 25 марта, 2020 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 25 марта, 2020 Опубликовано 25 марта, 2020 · Жалоба 2 hours ago, pokk said: Можно ли это как-то красиво сделать без разделения на 2 части? Не знаком с DMA у STM32F405, но если он поддерживает работу со связными списками, то да можно. При этом данные могут быть раскиданы по n-буферам (n количество). Следовательно, каждый элемент связного списка будет указывать на адрес следующего элемента. А элемент - это структура с данными, где одно поле - указатель на те данные, которые нужно передать. Если связные списки не поддерживает, то нужно завести буфер, который вмещает 4 байта адреса и все байты данных, скопировать всё это в него, а затем передать одной функцией Send_Spi_dma. Вы её писали? Вот пример, как сделан DMA у LPC4337 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 25 марта, 2020 Опубликовано 25 марта, 2020 (изменено) · Жалоба Да со связными списками хороший вариант получается, жаль их нету в stm =( 43 minutes ago, haker_fox said: то нужно завести буфер, который вмещает 4 байта адреса и все байты данных Да вот это тоже не хотелось бы делать так как буфер неизвестного размера надо определить, да и памяти жалко на такую фигню тратить. 43 minutes ago, haker_fox said: функцией Send_Spi_dma. Вы её писали? Да, там просто настройка DMA +ожидание завершения на ulTaskNotifyTake, а разрешение идет из прерываний по завершению транзакции DMA. Изменено 25 марта, 2020 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 25 марта, 2020 Опубликовано 25 марта, 2020 · Жалоба 2 hours ago, pokk said: жаль их нету в stm =( Да, бегло глянул RM. Думал просмотрел, но, значит, действительно нет. Странно! Такой мощный микроконтроллер на вид((( 2 hours ago, pokk said: да и памяти жалко на такую фигню тратить. Выделить статически буфер заведомо большого размера, но так, чтобы не всю ОЗУ потратить. А те блоки данных, которые не будут влзазить засылать в цикле. Да, DMA будет запускаться несколько раз, но не дёргаться по схеме 4 байта - 1 кБ. 2 hours ago, pokk said: ulTaskNotifyTake, а разрешение идет из прерываний по завершению транзакции DMA. Я понял, я ведь тоже также DMA использую только в LPC4337. Но со связными списками Возможно остальные коллеги, кто более плотно работает с STM что-то вам подскажут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 25 марта, 2020 Опубликовано 25 марта, 2020 · Жалоба 27 minutes ago, haker_fox said: Я понял, я ведь тоже также DMA использую только в LPC4337. Но со связными списками А если надо передать 1 байт ? Как делаеться ожидание на выставление CS? К примеру что бы разрешит запись во flash надо 1 байт передать. Сначала подумал все просто сделаю так же как DMA на прерываниях, но там получилось что после передачи, буфер TX пустой и прерывания начинают опять генерироваться пришлось включать выключать прерывания, и после всех манипуляций получилось что CS выставляется(в 1), примерно через 1.5 времени передачи байта, не то что бы долго но интересно как сделать по компактнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 25 марта, 2020 Опубликовано 25 марта, 2020 · Жалоба 4 минуты назад, pokk сказал: А если надо передать 1 байт ? Как делаеться ожидание на выставление CS? К примеру что бы разрешит запись во flash надо 1 байт передать. В МК с полноценной периферией (типа LPC/XMC4xxx/Tiva/...) SPI-каналы имеют FIFO. Так что можно записать команду (в несколко байт) в FIFO (процессором), а потом сразу разрешить работу DMA->SPI. И получить прерывание только одно - в конце DMA. Но Вы же сами выбрали такой МК, в котором SPI ущербный - без FIFO. И DMA без режима "связных списков". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 8 hours ago, jcxz said: Но Вы же сами выбрали такой МК, в котором SPI ущербный - без FIFO. И DMA без режима "связных списков". Охохохо... что-то с каждым днём STM32 мне кажутся всё менее и менее прекрасными. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 10 hours ago, jcxz said: Так что можно записать команду (в несколко байт) в FIFO (процессором) О т.е 4 байта адреса можно туда загнать, и потом включить DMA на передачу данных ? А какой примерно по размерности там буфер FIFO (2-10 байт или больше ?) 10 hours ago, jcxz said: В МК с полноценной периферией (типа LPC/XMC4xxx/Tiva/...) А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать? А то сижу на stm32 нефига незнаю =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 34 minutes ago, pokk said: А какой примерно по размерности там буфер FIFO (2-10 байт или больше ?) 34 minutes ago, pokk said: А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать? Про LPC4337 могу сказать следующее: 1. Два ядра: Cortex-M0/M4F, 204 МГц. 2. Довольно богатая периферия. 3. Возможность аппаратно кроссировать событий между модулями для их запуска, например. 4. Особняком бы упомянул SGPIO - конфигурируемый модуль последовательно-параллельных интерфейсов. Т.е. вы можете сделать на нём недостающую пару-семёрку USART, интерфейс к матрице цифровой камеры, интерфейс к квадратурным энкодерами и т.п. 5. Лучше скачате документацию и поглядите по диагонали) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 2 часа назад, pokk сказал: О т.е 4 байта адреса можно туда загнать, и потом включить DMA на передачу данных ? А какой примерно по размерности там буфер FIFO (2-10 байт или больше ?) "Там" это где? Во всех - разные. В XMC4xxx например - до 64 слов. Цитата А можно краткое описание чем они отличиаються и под какие задачи тот или другой ипользовать? А то сижу на stm32 нефига незнаю =( Чтение технической документации - только за деньги. Использовать можно любой под любые задачи. Сначала формулируется задача (задачи); потом - предположительные алгоритмы её решения; а уже затем - смотрятся мануалы на разные МК, и выбирается из доступных наиболее подходящий для решения этой задачи. Хотя (как складывается впечатление после прочтения большинства топиков здесь) подавляющее большинство ставят телегу впереди лошади. А потом героически пытаются заставить это хоть как-то ехать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 27 minutes ago, jcxz said: подавляющее большинство ставят телегу впереди лошади. Тут ещё срабатывает то, что на фирме пара-тройка человек работает только с xxx, yyy, zzz микроконтроллерами. Есть наработки в области ПО и железа. И, иногда, кажется, что проще извратиться, но решиь задачу знакомыми методами и средствами, чем тратить время на изучение нового микроконтроллера и написание под него ПО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 5 часов назад, haker_fox сказал: Охохохо... что-то с каждым днём STM32 мне кажутся всё менее и менее прекрасными. Дык они проще по возможностям, соответственно проще в освоении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 9 минут назад, haker_fox сказал: Тут ещё срабатывает то, что на фирме пара-тройка человек работает только с xxx, yyy, zzz микроконтроллерами. Есть наработки в области ПО и железа. И, иногда, кажется, что проще извратиться, но решиь задачу знакомыми методами и средствами, чем тратить время на изучение нового микроконтроллера и написание под него ПО. В этом случае, если не изучать нового, мозги со временем закисают и уже не способны решить новой задачи. Не надо идти на поводу у лентяев и неумех. Настоящий инженер (и программист в том числе) всю жизнь должен изучать и осваивать новое. Иначе он не инженер уже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба 7 minutes ago, jcxz said: Настоящий инженер (и программист в том числе) всю жизнь должен изучать и осваивать новое. Иначе он не инженер уже. Повторюсь) Я не знаю, как у вас, например, на работе) Но у меня есть начальник отдела. И, иногда, даже пяток обоснований не срабатывают. Есть уставка: использовать имеющееся. 8 minutes ago, jcxz said: Иначе он не инженер уже. Ну решение новой задачи на неподходящем для этого железа - тоже задача. Извините за тавтологию))) И мозги не закиснут) 13 minutes ago, HardEgor said: Дык они проще по возможностям, соответственно проще в освоении. Точно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 26 марта, 2020 Опубликовано 26 марта, 2020 · Жалоба Да ладно! Вы всерьёз завели разговор о смене МК только потому, что у автора темы одно "лишнее" прерывание при отправке пакета по SPI? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться