|
|
  |
SPI1 в STM32F429 считывает 0 в младший бит |
|
|
|
Jun 18 2016, 10:45
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(adnega @ Jun 18 2016, 11:40)  На пине микроконтроллера с AF SPI_MISO логическая единица, а приемник стабильно принимает байт с нулем в младшем разряде. Чего еще не понятно? Нигде этого не читал, сам с этим столкнулся и долго бодался. Было на каком-то SPI, на каком-то пине, (подробностей не помню, т.к. 2 года прошло) перешел на другие пины и другой номер SPI - чудеса пропали. Непонятно того, что из-за неправильного использования SPI (предполагаю, связано с периферийными тактами микроконтроллера), вы вдруг решили мне высказать несказанное, что на этом входе висит резистор. "Где имение, а где вода?" С железным подвешенным резистором можно быстрее докопаться до сути проблемы, чем с неким устройством, висящим в сбросе (может, и не выдающем единицу, а находящимся в высокоимпедансном состоянии). Желаете дальше дискутировать насчет резистора 0 ом? Цитата Prior to changing the CPOL/CPHA bits the SPI must be disabled by resetting the SPE bit. Цитата It is recommended to enable the SPI slave before the master sends the clock. If not, undesired data transmission might occur. The data register of the slave needs to be ready before the first edge of the communication clock or before the end of the ongoing communication. It is mandatory to have the polarity of the communication clock set to the steady state value before the slave and the master are enabled. Цитата During discontinuous communications, there is a 2 APB clock period delay between the write operation to SPI_DR and the BSY bit setting. As a consequence, in transmit-only mode, it is mandatory to wait first until TXE is set and then until BSY is cleared after writing the last data.
|
|
|
|
|
Jun 18 2016, 13:24
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ViKo @ Jun 18 2016, 16:01)  С первого же сообщения... Дык, это была всего-лишь иллюстрация странного поведения. Затем русским-по-белому говорилось о жесткой единице. Подтверждаю, что сам сталкивался на stm32f429i-disco с аналогичной ситуацией. Сначала получал от слейва левый "нолик", затем довел ситуацию до предела - подключил MISO к 3.3В, а считывалось 0xFE. Перешел на другой порт и другие пины - и слейв прекрасно заработал. В эррате не нашел сей глюк, для себя отметил, может, экземпляр МК с дефектом. Похоже, что нет.
|
|
|
|
|
Jun 18 2016, 14:07
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
То, что читалось 0xFE, связано с работой не по мануалу. Чтобы убедиться, я и предложил повесить резистор. Во всяком случае, подключенный "щуп" осциллографа уж точно не должен был влиять на разное чтение, если там висит единица всегда. Цитата(adnega @ Jun 18 2016, 16:24)  Перешел на другой порт и другие пины - и слейв прекрасно заработал. В эррате не нашел сей глюк, для себя отметил, может, экземпляр МК с дефектом. Похоже, что нет. Вы просто не докопались до сути проблемы, вот на что это похоже.
|
|
|
|
|
Jun 19 2016, 08:38
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Genadi Zawidowski @ Jun 18 2016, 23:04)  Код отсылки/приёма байта по SPI в студию... Давно то было. Допускаю, что примерно так было CODE //--------------------------------------------------------------------------- // LED & BUTTON //--------------------------------------------------------------------------- SPI_NSS_bit = 1; for(i = 0; i < 3; i++) __NOP(); SPI_OE_bit = 0; SPI_NSS_bit = 0;
SPI2->CR2 = (0 << SPI_CR2_RXNEIE) | (0 << SPI_CR2_TXDMAEN) | (0 << SPI_CR2_RXDMAEN) | (1 << SPI_CR2_SSOE);
DMA1_Stream4->CR = (0 << DMA_SCR_PL) | (0 << DMA_SCR_CHSEL) | (1 << DMA_SCR_MINC) | (1 << DMA_SCR_DIR) | (0 << DMA_SCR_EN);
DMA1_Stream3->CR = (0 << DMA_SCR_PL) | (0 << DMA_SCR_CHSEL) | (1 << DMA_SCR_MINC) | (0 << DMA_SCR_DIR) | (0 << DMA_SCR_EN);
DMA1->LIFCR = (0x3D << 22); DMA1->HIFCR = (0x3D << 0);
for(i = 0; i < 10; i++) __NOP();
DMA1_Stream3->PAR = (DWORD)&SPI2->DR; DMA1_Stream3->M0AR = (DWORD)spi_rx; DMA1_Stream3->NDTR = SPI_SIZE; DMA1_Stream3->CR = (0 << DMA_SCR_PL) | (0 << DMA_SCR_CHSEL) | (1 << DMA_SCR_MINC) | (0 << DMA_SCR_DIR) | (1 << DMA_SCR_EN);
DMA1_Stream4->PAR = (DWORD)&SPI2->DR; DMA1_Stream4->M0AR = (DWORD)spi_tx; DMA1_Stream4->NDTR = SPI_SIZE; DMA1_Stream4->CR = (0 << DMA_SCR_PL) | (0 << DMA_SCR_CHSEL) | (1 << DMA_SCR_MINC) | (1 << DMA_SCR_DIR) | (1 << DMA_SCR_EN);
for(i = 0; i < 10; i++) __NOP();
SPI2->CR2 = (0 << SPI_CR2_RXNEIE) | (1 << SPI_CR2_TXDMAEN) | (1 << SPI_CR2_RXDMAEN) | (1 << SPI_CR2_SSOE);
Это рабочий код, т.к. использует SPI2 и DMA1. Нерабочий был, вроде, на SPI4 и DMA2. Отправка работала корректно, а прием 2 байт давал нулевой младший бит (вроде только в первом принимаемом байте, а не в каждом).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|