SPI

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

alen_kray
Сообщения: 7
Зарегистрирован: 13 июл 2017, 15:24
Предприятие: temp_

Re: SPI

Сообщение alen_kray »

Спасибо за рекомендации)
Degrees
Сообщения: 13
Зарегистрирован: 05 сен 2018, 16:02
Предприятие: АО ПО "Север"

Re: SPI

Сообщение Degrees »

А кто-нибудь поделится работающим SPI... Казалось бы, нет ничего проще!!!

Код: Выделить всё

void Spi_Init_For_AD5322(void){       // SPI_0
	RCC_SPIClkSel(NT_SPI0,RCC_SPIClk_SYSCLK);	// Выбор источника тактового сигнала для выбранного SPI
	RCC_SPIClkDivConfig(NT_SPI0,2,ENABLE);		// Настройка делителя тактового сигнала для выбранного SPI.
	RCC_SPIClkCmd(NT_SPI0, ENABLE);				// Включение тактирования SPI.

	CS_DISABLE;	// снятие chip select

	NT_SPI0->SPI_CPSR_bit.CPSDVSR = 0x02;		// Коэффициент деления первого делителя. Может принимать четные значения от 02h до FEh

	NT_SPI0->SPI_CR0_bit.SCR = 0;				// Коэффициент деления второго делителя. значения 00h до FFh
	NT_SPI0->SPI_CR0_bit.FRF = 0;				// SPI_0 как SPI
	NT_SPI0->SPI_CR0_bit.SPO = 1;				// Полярность сигнала SSPCLKOUT    1 ````````````|_|`|_|`|_|`|_|````````````````   для 0 наоборот
	NT_SPI0->SPI_CR0_bit.SPH = 1;				// Фаза сигнала SSPCLKOUT          0=> __|`!__   1=> __!`|__ 
	NT_SPI0->SPI_CR0_bit.DSS = 0x0F;			// Размер слова данных    16 бит

	NT_SPI0->SPI_CR1_bit.MS = 0;				// мастер
	NT_SPI0->SPI_CR1_bit.SSE =  1;				// разрешение работы приемопередатчика.

}



void AD5322_Load(uint16_t ch, uint16_t data){
	CS_ENABLE;			// chip select загнали в "0"
	NT_SPI0->SPI_DR_bit.DATA = (data & 0x0FFF) | (ch << 15); // запись
	while(NT_SPI0->SPI_SR_bit.BSY);
	uint16_t temp = NT_SPI0->SPI_DR_bit.DATA;   // чтение
	CS_DISABLE;			// chip select загнали в "1"
}
Два дня тыкался ... не хочет работать. Выводы микроконтроллера настраивал как положено.
CS_ENABLE; CS_DISABLE; ногой дергает, если

Код: Выделить всё

// while(NT_SPI0->SPI_SR_bit.BSY);
закоментарить.
Бит NT_SPI0->SPI_SR_bit.BSY постоянно находится в "1".
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Degrees писал(а): 09 авг 2019, 15:03 А кто-нибудь поделится работающим SPI... Казалось бы, нет ничего проще!!!

Два дня тыкался ... не хочет работать. Выводы микроконтроллера настраивал как положено.
CS_ENABLE; CS_DISABLE; ногой дергает, если

Код: Выделить всё

// while(NT_SPI0->SPI_SR_bit.BSY);
закоментарить.
Бит NT_SPI0->SPI_SR_bit.BSY постоянно находится в "1".
Добрый день!

Необходимо также вывести приемопередатчик из сброса, чтобы он начал работу:

Код: Выделить всё

Добавить в инициализацию
RCC_PeriphRstCmd(RCC_PeriphRst_SPI0, ENABLE);
или
NT_COMMON_REG->PER_RST0_bit.SPIRST0 = 1;
Также хотел предостеречь от работы с регистром данных через битовые поля - подобная операция приводит к процедуре "чтение-модификация-запись", т.е. одновременно и вычитывает и записывает буфер, что может вызвать затруднения при двустороннем обмене.
Degrees
Сообщения: 13
Зарегистрирован: 05 сен 2018, 16:02
Предприятие: АО ПО "Север"

Re: SPI

Сообщение Degrees »

Да, я уже нашел в репозитории пример инициализации SPI. Спасибо!
petrovitch
Сообщения: 107
Зарегистрирован: 15 фев 2017, 19:07

Re: SPI

Сообщение petrovitch »

Здравствуйте!

1. Как поведут себя флаги заполнения FIFO приёмника, если я буду писать туда одни нули (ноль ведь тоде может быть значением чего-то)?

2. Как можно организовать программную синхронизацию в случае поступления в буфер приёмника так необходимых мне именно четырёх слов, а не одного-двух? И как лучше записывать слова в буфер передатчика ведомого SPI, чтобы не натолкнуться на сам процесс приёма от мастера?

3. При записи в буфер передатчика ведомого SPI (конечно до того как пойдут данные от мастера) требуется ли запрещать или сбрасывать SPI?

4. Создаётся впечатление, что биты RFF и RNE регистра SPI_SR дублируют друг друга. "не пуст" и "заполнен" почти одно и то же. В чём разница? А вот на сколько заполнен или пуст понять нельзя.
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Добрый день!

1. Точно так же как если бы писали 0x0001, 0xFFFF или 0xBEEF или любые другие данные.
2. Можно смотреть флаг RXRIS - он установится при заполнении буфера приемника наполовину (4 слова из 8). Никаких особых требований нет - просто берете и записываете. Буферы на прием и передачу отдельные, функционируют параллельно.
3. Ничего не требуется.
4. Не совсем одно и тоже. RFF - буфер заполнен (8 слов из 8), RNE - буфер не пуст (от 1 до 8 слов). Можно отлавливать только заполнение/опустошение на половину - флаги RXRIS, TXRIS.
petrovitch
Сообщения: 107
Зарегистрирован: 15 фев 2017, 19:07

Re: SPI

Сообщение petrovitch »

2. Можно смотреть флаг RXRIS - он установится при заполнении буфера приемника наполовину (4 слова из 8).
Устанавливается ли этот флаг в случае, если прерывания от SPI запрещены?
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Флаги xRIS устанавливаются всегда, флаги xMIS только если маскированы - и именно их установка вызывает прерывание.
petrovitch
Сообщения: 107
Зарегистрирован: 15 фев 2017, 19:07

Re: SPI

Сообщение petrovitch »

Не могу понять причины отсутствия передачи данных по SPI.

SPI работает в режиме ведомого. На приём всё идёт хорошо - от мастера данные поступают правильные.
А вот передача молчит. На ножке TX почему-то примерно 1.8В и тишина, когда синхронизация от мастера идёт.

При этом бит SOD=0 MS=1. Да и остальные настройки вроду бы правильные. Что может быть не так?
bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov »

Передача от ведомого, верно?

Т.е. вы в ведомом записали данные в буфер. Посылаете мастером пустую посылку, и видите что от ведомого записанные данные не передаются, а линия просто висит в одном состоянии?

А вот какой-то средний уровень на ножке это странно, честно говоря.
Ответить

Вернуться в «32-разрядные микроконтроллеры»