SPI
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Re: SPI
Спасибо за рекомендации)
Re: SPI
А кто-нибудь поделится работающим SPI... Казалось бы, нет ничего проще!!!
Два дня тыкался ... не хочет работать. Выводы микроконтроллера настраивал как положено.
CS_ENABLE; CS_DISABLE; ногой дергает, если закоментарить.
Бит NT_SPI0->SPI_SR_bit.BSY постоянно находится в "1".
Код: Выделить всё
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".
Re: SPI
Добрый день!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;
Re: SPI
Да, я уже нашел в репозитории пример инициализации SPI. Спасибо!
-
- Сообщения: 106
- Зарегистрирован: 15 фев 2017, 19:07
Re: SPI
Здравствуйте!
1. Как поведут себя флаги заполнения FIFO приёмника, если я буду писать туда одни нули (ноль ведь тоде может быть значением чего-то)?
2. Как можно организовать программную синхронизацию в случае поступления в буфер приёмника так необходимых мне именно четырёх слов, а не одного-двух? И как лучше записывать слова в буфер передатчика ведомого SPI, чтобы не натолкнуться на сам процесс приёма от мастера?
3. При записи в буфер передатчика ведомого SPI (конечно до того как пойдут данные от мастера) требуется ли запрещать или сбрасывать SPI?
4. Создаётся впечатление, что биты RFF и RNE регистра SPI_SR дублируют друг друга. "не пуст" и "заполнен" почти одно и то же. В чём разница? А вот на сколько заполнен или пуст понять нельзя.
1. Как поведут себя флаги заполнения FIFO приёмника, если я буду писать туда одни нули (ноль ведь тоде может быть значением чего-то)?
2. Как можно организовать программную синхронизацию в случае поступления в буфер приёмника так необходимых мне именно четырёх слов, а не одного-двух? И как лучше записывать слова в буфер передатчика ведомого SPI, чтобы не натолкнуться на сам процесс приёма от мастера?
3. При записи в буфер передатчика ведомого SPI (конечно до того как пойдут данные от мастера) требуется ли запрещать или сбрасывать SPI?
4. Создаётся впечатление, что биты RFF и RNE регистра SPI_SR дублируют друг друга. "не пуст" и "заполнен" почти одно и то же. В чём разница? А вот на сколько заполнен или пуст понять нельзя.
Re: SPI
Добрый день!
1. Точно так же как если бы писали 0x0001, 0xFFFF или 0xBEEF или любые другие данные.
2. Можно смотреть флаг RXRIS - он установится при заполнении буфера приемника наполовину (4 слова из 8). Никаких особых требований нет - просто берете и записываете. Буферы на прием и передачу отдельные, функционируют параллельно.
3. Ничего не требуется.
4. Не совсем одно и тоже. RFF - буфер заполнен (8 слов из 8), RNE - буфер не пуст (от 1 до 8 слов). Можно отлавливать только заполнение/опустошение на половину - флаги RXRIS, TXRIS.
1. Точно так же как если бы писали 0x0001, 0xFFFF или 0xBEEF или любые другие данные.
2. Можно смотреть флаг RXRIS - он установится при заполнении буфера приемника наполовину (4 слова из 8). Никаких особых требований нет - просто берете и записываете. Буферы на прием и передачу отдельные, функционируют параллельно.
3. Ничего не требуется.
4. Не совсем одно и тоже. RFF - буфер заполнен (8 слов из 8), RNE - буфер не пуст (от 1 до 8 слов). Можно отлавливать только заполнение/опустошение на половину - флаги RXRIS, TXRIS.
-
- Сообщения: 106
- Зарегистрирован: 15 фев 2017, 19:07
Re: SPI
Устанавливается ли этот флаг в случае, если прерывания от SPI запрещены?2. Можно смотреть флаг RXRIS - он установится при заполнении буфера приемника наполовину (4 слова из 8).
Re: SPI
Флаги xRIS устанавливаются всегда, флаги xMIS только если маскированы - и именно их установка вызывает прерывание.
-
- Сообщения: 106
- Зарегистрирован: 15 фев 2017, 19:07
Re: SPI
Не могу понять причины отсутствия передачи данных по SPI.
SPI работает в режиме ведомого. На приём всё идёт хорошо - от мастера данные поступают правильные.
А вот передача молчит. На ножке TX почему-то примерно 1.8В и тишина, когда синхронизация от мастера идёт.
При этом бит SOD=0 MS=1. Да и остальные настройки вроду бы правильные. Что может быть не так?
SPI работает в режиме ведомого. На приём всё идёт хорошо - от мастера данные поступают правильные.
А вот передача молчит. На ножке TX почему-то примерно 1.8В и тишина, когда синхронизация от мастера идёт.
При этом бит SOD=0 MS=1. Да и остальные настройки вроду бы правильные. Что может быть не так?
Re: SPI
Передача от ведомого, верно?
Т.е. вы в ведомом записали данные в буфер. Посылаете мастером пустую посылку, и видите что от ведомого записанные данные не передаются, а линия просто висит в одном состоянии?
А вот какой-то средний уровень на ножке это странно, честно говоря.
Т.е. вы в ведомом записали данные в буфер. Посылаете мастером пустую посылку, и видите что от ведомого записанные данные не передаются, а линия просто висит в одном состоянии?
А вот какой-то средний уровень на ножке это странно, честно говоря.