Перейти к содержанию
    

Во-первЫх, под отладчиком всё будет видно, можно даже код не писать - руками флажки выставить.
Во-вторых, если ((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: "сложный русских языка" не родной что ли?
Изменено пользователем Obam
отвлекли

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте ! Пытаюсь разобраться с 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
}

image.thumb.png.c39f28a094c18431bde42670a9f8c3ff.png

Изменено пользователем haker_fox
Для оформления кода есть кнопка <>. Потрудитесь оформлять код, чтобы он был читаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Алекsей сказал:

8 стробов есть (должно быть 16),

[...]

Что не так делаю ?

Вот это:

21 минуту назад, Алекsей сказал:

*((__IO uint8_t *)&SPI1->TXDR) = addres;

Отложите в сторону куб, читайте документацию. Конкретно ваш вопрос описан в разделе SPI->functional description->Data transmission and reception procedures->Data packing.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ещё при использовании DMA возможны проблемы из-за того, что у Cortex-M7 есть кэш -- соответственно, перед запуском передачи по DMA надо убедиться, что данные физически лежат в памяти (а не только в кэше), ну а после завершения приёма -- очистить кэш, чтоб добраться до данных в памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, Сергей Борщ сказал:

Вот это:

Отложите в сторону куб, читайте документацию. Конкретно ваш вопрос описан в разделе SPI->functional description->Data transmission and reception procedures->Data packing.

Хорошо, сейчас буду разбираться )

18 часов назад, Сергей Борщ сказал:

 

 

10 часов назад, SII сказал:

при использовании DMA

Сейчас DMA не использую, но вообще проверял ради интереса - кеш это отдельная "тема", пока его отключил ) 

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу разобраться...
 

 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 ...)

 

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


// передача

	  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);

При такой конструкции происходит правильное считывание регистра "ведомого". 

Сейчас бы понять что нужно изменить в настройках.. 

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Всё крутит, всё светится... только не поёт"

Регистры устанавливаю и считываю по spi (через регистры).

Не могу избавиться от двойного считывания регистра - RXDR

	  *((__IO uint8_t *) & SPI_rf98->RXDR);           // именно такое обращение !!!
	  rf_data = *((__IO uint8_t *) & SPI_rf98->RXDR); // именно такое обращение !!!

 Как назначить упаковку в один пакет (на сколько я понимаю). 

Пока FIFO не "прокрутишь" нужные данные не получить.

Всё перепробовал 

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуйте читать RX FIFO сразу после передачи (дождавшись флага готовности приемника), без этого на H7 никак.
Читать столько же, сколько передали.
Для простоты разборок попробуйте 8-битными порциями

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не проверял форум...

Читаю сразу после отправки. Ставил при чтении 16 бит (как и при отправке).

А по поводу "8 битных порций" я не понимаю... Что бы ведомый выдал ответ (8 бит), нужно ему передать адрес (8 бит). Соответственно я делаю передачу ведомому 16 бит (отправляю 8 бит, а spi выставляет 16 стробов на sck, на следующие 8 стробов считываю принятые данные)  

*(volatile uint16_t *) &(SPI1->TXDR) = addres;

Может быть мне надо назначить режим spi - передатчик, отправить ведомому адрес. После этого назначить режим spi - приёмник ?  Соответственно, передавать буду и принимать по 8 бит. 

Сейчас и так всё работает, но мне нужно (будет) передавать адрес ведомому, а затем непрерывно считывать байт за байтом (FIFO ведомого), вот в таком режиме как заставить работать spi H7 я не представляю ...   

Чего то я не то делаю, говоря по простому ) 

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Алекsей сказал:

Сейчас и так всё работает, но мне нужно (будет) передавать адрес ведомому, а затем непрерывно считывать байт за байтом (FIFO ведомого),

Мне кажется вы чего-то не понимаете глобально. В SPI передача и прием всегда происходят одновременно. Если ведущий хочет что-то принять - он обязан сформировать тактовый сигнал передавая что-либо (хоть мусор). А также, если он что-то передает - должен считывать принятый во время передачи мусор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего именно так и есть. Да не понимаю, но вот чего...

По поводу двойного считывания буфера всё равно мне не понятно (но похоже это только у меня, значит..).

 

А по вашему замечанию:

Ставлю осциллограф на 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 бит (есть тактирование ведомого и он выдаёт по ним дату). 

 

Получается, надо отправлять ВСЕГДА данные (мусор) и соответственно, ведомый его читать не будет, а по сигналу тактирования будет происходить считывание ? Такой вариант я не предполагал ) (главное что бы ведомый от этого мусора в ступор не вошёл)

Надо попробовать )  

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, Алекsей said:

На sck ничего нет.. И принятых данных тоже нет.

На SCK ничего и не должно быть, т.к. транзакцию запускает только запись. А считанные данные были получены во время предшествующей передачи.

 

Представьте, что SPI выполнен одним сдвиговым регистром, где на входе MISO, а на выходе MOSI. Нельзя принять данные без одновременной передачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ааа )

Спасибо, думал как например uart - хочешь принимай ничего не отправляя ) 

В моём случае, при чтении буфера ведомого в роли "мусора" отправлять можно адрес (буфера ведомого). При такой схеме у меня так и работает. 

Я  предполагал, что можно увеличить быстродействие считывания буфера, если не отправлять постоянно лишний байт (мусора). Хотя там и так время увеличиваться не будет, не сообразил. На осциллографе только один канал подсоединял... ) 

Понял, ещё раз спасибо !  В этом вопросе разобрался )

Изменено пользователем Алекsей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как подсчитать номер  DMAx_Streamx  который связан с  spi2_tx_dma   40 ? 

Для stm32f7 есть таблица в доке  а для stm32h7  в таблице  нарисовано 40  spi2_tx_dma.

   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...