Ви не увійшли.
Сторінки 1
Добрий день.
Є задача: потрібно дані з швидкого АЦП (AD7606, 8 каналів, макс. швидкість 200 кГц) передати на мінікомп'ютер (Jetson Nano).
Для цього є плата STM32 (поки що це Maple Mini), яка формує необхідні для роботи АЦП імпульси, і збирає результати в кільцевий буфер. Планується по мірі заповнення буфера відправляти дані частинами на Jetson Nano по SPI.
Сам Jetson Nano працює як SPI-Master.
Чи має хтось досвід як на STM32 підняти SPI в режимі "slave" з використанням DMA щоб періодично відправляти кільцевий буфер?
Неактивний
А для чого взагалі тут STM32 ?
В Jetson Nano є порти GPIO...
Міряти потрібно всі 8 каналів на частоті семплів 200 кГц.
АЦП потребує сигналу на запуск процесу вимірювання. Період цього сигналу (5 мікросекунд) потрібно витримати доволі точно.
Для Jetson Nano будуть свої завдання по обробці отриманих даних і не факт що він зможе з таким справитись, він же не real-time платформа.
STM32 достатньо швидкий і не зайнятий нічим іншим і тому може забезпечити надійну генерацію сигналу на запуск вимірювання АЦП.
(додано)
Виявляється, Jetson Nano на GPIO виходах вміє генерувати PWM.
А це вже виглядає цікавіше.
Остання редакція anandr (2023-04-22 08:07:06)
Неактивний
Для того, щоб на STM32 підняти SPI в режимі "slave" з використанням DMA для періодичної відправки кільцевого буфера, вам спочатку потрібно налаштувати SPI в режимі "slave" з використанням DMA.
Налаштування SPI в режимі "slave":
SPI_HandleTypeDef SpiHandle;
/* SPI1 init function */
void MX_SPI1_Init(void)
{
SpiHandle.Instance = SPI1;
SpiHandle.Init.Mode = SPI_MODE_SLAVE;
SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
SpiHandle.Init.NSS = SPI_NSS_SOFT;
SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SpiHandle.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&SpiHandle) != HAL_OK)
{
Error_Handler();
}
}
Налаштування DMA для SPI:
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel2_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
/* SPI1_TX Init */
hdma_spi1_tx.Instance = DMA1_Channel2;
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_tx.Init.Mode = DMA_CIRCULAR;
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
/* Link DMA to SPI */
__HAL_LINKDMA(&SpiHandle, hdmatx, hdma_spi1_tx);
Налаштування кільцевого буфера і запуск передачі через DMA:
#define BUFFER_SIZE 16
uint8_t txBuffer[BUFFER_SIZE];
uint8_t rxBuffer[BUFFER_SIZE];
void SPI_Transmit_DMA(void)
{
/* Start the DMA transfer */
if (HAL_SPI_Transmit_DMA(&SpiHandle, txBuffer, BUFFER_SIZE) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
/* This function will be called when the DMA transfer is complete */
/* Copy data from the receive buffer to the transmit buffer */
memcpy(txBuffer, rxBuffer, BUFFER_SIZE);
}
int main(void)
{
/* Initialize the SPI and DMA */
MX_SPI1_Init();
MX_DMA_Init();
/* Initialize the transmit buffer */
for (int i = 0; i < BUFFER_SIZE; i++)
{
txBuffer[/
= ;
Для того, щоб на STM32 підняти SPI в режимі "slave" з використанням DMA для періодичної відправки кільцевого буфера, вам спочатку потрібно налаштувати SPI в режимі "slave" з використанням DMA.
Відчівається рука чатжопете
точно,ChatGPT
Відчівається рука чатжопете
Ооооо, чатжопете ....
Я так розумію, що якщо якась конкретна тема задачі популярна в інеті і по ній можна знайти багато різних варіантів її вирішення, то чатжопете може швидко перебрати варіанти і справді щось підказати (я чув від реальних людей ну дуже похвальні відгуки).
Але якщо тема така, що в гугл видає менше десяти результатів по запиту, то і на чатжопете надії ніякої.
Мені, наприклад, на запит [як налаштувати SPI на Jetson Nano в режимі "master"] і [як налаштувати SPI на Jetson Nano в режимі "slave"] чатжопете видав дві ідентичні послідовності команд.
Тому з кожною задачею ефективність чатжопете буде якась своя.
Ну а поки готуємось до появи вакансій типу "Спеціаліст з аналізу, рефакторингу, і допилювання коду, написаного чатжопете"
Остання редакція anandr (2023-04-23 14:30:07)
Неактивний
З кодами від чатжопете іноді жопата ще
Як по мені. Так SPI краще використовувати для внутрішньо-схемного програмування, та і годі.
А ведучий-ведомий, то вже є інші технології реалізації. RS-485, CAN, та таке інше ...
Як по мені. Так SPI краще використовувати для внутрішньо-схемного програмування, та і годі.
А ведучий-ведомий, то вже є інші технології реалізації. RS-485, CAN, та таке інше ...
Так SPI объективно не подходит для передачи данных за пределы печатной платы. 0 помехоустойчивости же. Лучше всего (быстрее) это юзать LAN - там и скорость и готовые шнуры и унификация. Только с сокетами успевай работать.
Ну и конечно же, как Вы правильно подметили Recomended Standards: RS-422, RS-423, RS-449, RS-485, MIL-STD-188, EIA-530.
Васятко пише:Відчівається рука чатжопете
Ооооо, чатжопете ....
Я так розумію, що якщо якась конкретна тема задачі популярна в інеті і по ній можна знайти багато різних варіантів її вирішення, то чатжопете може швидко перебрати варіанти і справді щось підказати (я чув від реальних людей ну дуже похвальні відгуки).
Имея за спиной 7 лет Embedded программирования и посидев пару месяцев с жопатэ могу сделать вывод, что сейчас он находится на уровне школьника генерирующего бредовые идеи по принципу "лишь бы быстро". За все время использования время потраченное за выбивание из малолетнего искусственного интеллекта правильного ответа превышало время затраченное на самостоятельное решение задачи. И только один!!11 раз жопотэ помог решить хитрую задачу по дебрям классового взаимодействия С++ быстрее чем стаковерфлоу (5 часов). В профессиональной среде ему еще делать нечего. Разве что писать красивые письма и истории. Это да, я аж глазам не поверил, когда он написал за меня настолько идеальное по всем правилам инглиша сопроводительное письмо (со всеми этими средневековыми оборотами от которых все текут). Тут был восторг, да)
Так что замены профессий хорошего програмера в ближайшем будущем не ждем. Разве что эникейщикам надо бы поднапрячься, но они сами виноваты, что не хотят эволюционировать в толковых инженеров оставаясь на уровне ардуино
Сторінки 1