Obam 38 15 декабря, 2022 Опубликовано 15 декабря, 2022 (изменено) · Жалоба Во-первЫх, под отладчиком всё будет видно, можно даже код не писать - руками флажки выставить. Во-вторых, если ((SPI3_H << 16) | SPI3_L) базовый адрес, то SPI_CFG2_B (и проч.) - это адрес регистра или смещение относительно "базы"? Если адрес регистра, то: str r1,[r0,#(SPI_CFG2_B - ((SPI3_H << 16) | SPI3_L))] или mov32 r0,#(SPI_CFG2_B) str r1,[r0] А если смещение, тогда да: str r1,[r0,#SPI_CFG2_B] PS: "сложный русских языка" не родной что ли? Изменено 15 декабря, 2022 пользователем Obam отвлекли Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 2 мая, 2023 Опубликовано 2 мая, 2023 (изменено) · Жалоба Здравствуйте ! Пытаюсь разобраться с spi на stm32h743. Отправка по spi идёт. На выводе SCK - 8 стробов есть (должно быть 16), соответственно на приём ничего не приходит... Что не так делаю ? Настройка в cubeide. // старт SPI SPI1->CR2 = 0; SPI1->CR1 |= SPI_CR1_SPE; SPI1->CR1 |= SPI_CR1_CSTART; // записываю и считываю данные { CS_LOW( ); addres = 0x0A; while ( !( SPI1->SR & SPI_SR_TXP ) ); // ждём завершение передачи *( ( __IO uint8_t * )&SPI1->TXDR ) = addres; while( !( SPI1->SR & SPI_SR_RXP ) ); // ждём завершение приёма data = *( volatile uint8_t * )&( SPI1->RXDR ); CS_HIGH( ); //Set CS high to end communication } Изменено 3 мая, 2023 пользователем haker_fox Для оформления кода есть кнопка <>. Потрудитесь оформлять код, чтобы он был читаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 2 мая, 2023 Опубликовано 2 мая, 2023 · Жалоба 21 минуту назад, Алекsей сказал: 8 стробов есть (должно быть 16), [...] Что не так делаю ? Вот это: 21 минуту назад, Алекsей сказал: *((__IO uint8_t *)&SPI1->TXDR) = addres; Отложите в сторону куб, читайте документацию. Конкретно ваш вопрос описан в разделе SPI->functional description->Data transmission and reception procedures->Data packing. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 2 мая, 2023 Опубликовано 2 мая, 2023 · Жалоба А ещё при использовании DMA возможны проблемы из-за того, что у Cortex-M7 есть кэш -- соответственно, перед запуском передачи по DMA надо убедиться, что данные физически лежат в памяти (а не только в кэше), ну а после завершения приёма -- очистить кэш, чтоб добраться до данных в памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 3 мая, 2023 Опубликовано 3 мая, 2023 (изменено) · Жалоба 18 часов назад, Сергей Борщ сказал: Вот это: Отложите в сторону куб, читайте документацию. Конкретно ваш вопрос описан в разделе SPI->functional description->Data transmission and reception procedures->Data packing. Хорошо, сейчас буду разбираться ) 18 часов назад, Сергей Борщ сказал: 10 часов назад, SII сказал: при использовании DMA Сейчас DMA не использую, но вообще проверял ради интереса - кеш это отдельная "тема", пока его отключил ) Изменено 3 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 4 мая, 2023 Опубликовано 4 мая, 2023 (изменено) · Жалоба Не могу разобраться... while (!(SPI1->SR & SPI_SR_TXP)); // Ждать завершения передачи *(volatile uint16_t *) &(SPI1->TXDR) = addres; while(!(SPI1->SR & SPI_SR_RXP)); // Ждать завершения приёма rf_data = *(volatile uint16_t *) &(SPI1->RXDR); При такой записи ответ от ведомого устройства идёт но принимается не верно. Не могу понять как выставить правильно "DSIZE", что бы настроить верное срабатывание RXP флага. (как настроить FTHLV[3:0] в регистре SPI_CFG1 ...) Изменено 4 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 4 мая, 2023 Опубликовано 4 мая, 2023 (изменено) · Жалоба // передача while (!(SPI1->SR & SPI_SR_TXP)); *(volatile uint16_t *) &(SPI1->TXDR) = addres; // приём while (!(SPI1->SR & SPI_SR_RXP)); // Ждать завершения приёма rf_data = *(volatile uint8_t *) &(SPI1->RXDR); rf_data = *(volatile uint8_t *) &(SPI1->RXDR); При такой конструкции происходит правильное считывание регистра "ведомого". Сейчас бы понять что нужно изменить в настройках.. Изменено 4 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 6 мая, 2023 Опубликовано 6 мая, 2023 (изменено) · Жалоба "Всё крутит, всё светится... только не поёт" Регистры устанавливаю и считываю по spi (через регистры). Не могу избавиться от двойного считывания регистра - RXDR *((__IO uint8_t *) & SPI_rf98->RXDR); // именно такое обращение !!! rf_data = *((__IO uint8_t *) & SPI_rf98->RXDR); // именно такое обращение !!! Как назначить упаковку в один пакет (на сколько я понимаю). Пока FIFO не "прокрутишь" нужные данные не получить. Всё перепробовал Изменено 6 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 9 мая, 2023 Опубликовано 9 мая, 2023 (изменено) · Жалоба попробуйте читать RX FIFO сразу после передачи (дождавшись флага готовности приемника), без этого на H7 никак. Читать столько же, сколько передали. Для простоты разборок попробуйте 8-битными порциями Изменено 9 мая, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 13 мая, 2023 Опубликовано 13 мая, 2023 (изменено) · Жалоба не проверял форум... Читаю сразу после отправки. Ставил при чтении 16 бит (как и при отправке). А по поводу "8 битных порций" я не понимаю... Что бы ведомый выдал ответ (8 бит), нужно ему передать адрес (8 бит). Соответственно я делаю передачу ведомому 16 бит (отправляю 8 бит, а spi выставляет 16 стробов на sck, на следующие 8 стробов считываю принятые данные) *(volatile uint16_t *) &(SPI1->TXDR) = addres; Может быть мне надо назначить режим spi - передатчик, отправить ведомому адрес. После этого назначить режим spi - приёмник ? Соответственно, передавать буду и принимать по 8 бит. Сейчас и так всё работает, но мне нужно (будет) передавать адрес ведомому, а затем непрерывно считывать байт за байтом (FIFO ведомого), вот в таком режиме как заставить работать spi H7 я не представляю ... Чего то я не то делаю, говоря по простому ) Изменено 13 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 13 мая, 2023 Опубликовано 13 мая, 2023 · Жалоба 6 часов назад, Алекsей сказал: Сейчас и так всё работает, но мне нужно (будет) передавать адрес ведомому, а затем непрерывно считывать байт за байтом (FIFO ведомого), Мне кажется вы чего-то не понимаете глобально. В SPI передача и прием всегда происходят одновременно. Если ведущий хочет что-то принять - он обязан сформировать тактовый сигнал передавая что-либо (хоть мусор). А также, если он что-то передает - должен считывать принятый во время передачи мусор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 13 мая, 2023 Опубликовано 13 мая, 2023 (изменено) · Жалоба Скорее всего именно так и есть. Да не понимаю, но вот чего... По поводу двойного считывания буфера всё равно мне не понятно (но похоже это только у меня, значит..). А по вашему замечанию: Ставлю осциллограф на sck *(volatile uint8_t *) &(SPI1->TXDR) = addres; После этой строки на sck ровно 8 стробов и отправленный 1 байт на выводе spi mosi (выход ведущего). Далее rf_data = *((__IO uint8_t *) & SPI_rf98->RXDR); На sck ничего нет.. И принятых данных тоже нет. Второй вариант: *(volatile uint16_t *) &(SPI1->TXDR) = addres; На выводе sck 16 стробов. По первым 8 отправляется 8 бит, по следующим 8 стробам принимаются 8 бит (есть тактирование ведомого и он выдаёт по ним дату). Получается, надо отправлять ВСЕГДА данные (мусор) и соответственно, ведомый его читать не будет, а по сигналу тактирования будет происходить считывание ? Такой вариант я не предполагал ) (главное что бы ведомый от этого мусора в ступор не вошёл) Надо попробовать ) Изменено 13 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 13 мая, 2023 Опубликовано 13 мая, 2023 · Жалоба 10 minutes ago, Алекsей said: На sck ничего нет.. И принятых данных тоже нет. На SCK ничего и не должно быть, т.к. транзакцию запускает только запись. А считанные данные были получены во время предшествующей передачи. Представьте, что SPI выполнен одним сдвиговым регистром, где на входе MISO, а на выходе MOSI. Нельзя принять данные без одновременной передачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алекsей 1 13 мая, 2023 Опубликовано 13 мая, 2023 (изменено) · Жалоба Ааа ) Спасибо, думал как например uart - хочешь принимай ничего не отправляя ) В моём случае, при чтении буфера ведомого в роли "мусора" отправлять можно адрес (буфера ведомого). При такой схеме у меня так и работает. Я предполагал, что можно увеличить быстродействие считывания буфера, если не отправлять постоянно лишний байт (мусора). Хотя там и так время увеличиваться не будет, не сообразил. На осциллографе только один канал подсоединял... ) Понял, ещё раз спасибо ! В этом вопросе разобрался ) Изменено 13 мая, 2023 пользователем Алекsей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 9 ноября, 2023 Опубликовано 9 ноября, 2023 · Жалоба Как подсчитать номер DMAx_Streamx который связан с spi2_tx_dma 40 ? Для stm32f7 есть таблица в доке а для stm32h7 в таблице нарисовано 40 spi2_tx_dma. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться