SPI

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

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

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

Re: SPI

Сообщение alen_kray » 11 мар 2019, 15:16

Спасибо за рекомендации)

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

Re: SPI

Сообщение Degrees » 09 авг 2019, 15:03

А кто-нибудь поделится работающим 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
Сообщения: 198
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: SPI

Сообщение bkolbov » 12 авг 2019, 09:42

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
Сообщения: 9
Зарегистрирован: 05 сен 2018, 16:02
Предприятие: АО ПО "Север"

Re: SPI

Сообщение Degrees » 13 авг 2019, 11:02

Да, я уже нашел в репозитории пример инициализации SPI. Спасибо!

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость