GenaSPB 11 23 июля, 2018 Опубликовано 23 июля, 2018 (изменено) · Жалоба Снять SPE бит в конце пробовали? Изменено 23 июля, 2018 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 23 июля, 2018 Опубликовано 23 июля, 2018 · Жалоба Да, в обработчике прерывания EOT, отключаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 июля, 2018 Опубликовано 23 июля, 2018 · Жалоба Тогда не знаю... В моем варианте connect/send_frame/disconnect много раз повторяются... есть устройство работающее. У Вас нормальный процессор, не ES32Hxxx ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 23 июля, 2018 Опубликовано 23 июля, 2018 · Жалоба Да вроде нормальный. https://drive.google.com/open?id=1Jibo-gxol...5AZZYmEYEfauK-Q Пытаюсь выполнить рекомендованную последовательность: To close communication it is mandatory to follow these steps in order: 1. Disable DMA request for Tx and Rx in the DMA registers, if the DMA issued. 2. Disable the SPI by following the SPI disable procedure. 3. Disable DMA Tx and Rx buffers by clearing the TXDMAEN and RXDMAEN bits in the SPI_CFG1 register, if DMA Tx and/or DMA Rx are used. Не совсем понятен первый пункт, ДМА стрим я отключаю, но как отключить запросы ДМА по Tx в регистрах ДМА я не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 23 июля, 2018 Опубликовано 23 июля, 2018 · Жалоба После отключения SPI (SPE), в регистре статуса появляеться черти что, мол данные не все ушли, RxFIFO не пуст. Я плюнул играться и после передачи пакета просто сбрасываю модуль, кстати в эррате есть подобная фигня на счет ДМА, но немного не такая. Теперь работает нормально. Благо инициализация SPI 2 регистра записать. С другой стороны не так уж и печально задача заняла ресурс попользовала и отключила. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 23 июля, 2018 Опубликовано 23 июля, 2018 · Жалоба MasterElectric , у Вас приём через прерывание нормально работает? У меня странно как-то - эхо (через проводок MOSI - MISO) нормально идёт, а пытаюсь работать с датчиком BME280 - он на команды не реагирует, читаются одни нули. Дисплей (вообще без ноги MISO) тож нормально работает. Дисп отключил, датчик к тем же ногам подключен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 23 июля, 2018 Опубликовано 23 июля, 2018 (изменено) · Жалоба может полярность или фаза не так настроена. пока просто пробую на анализатор нужно еще rx пдп попробовать.не работала с упакованными данными, особо не печалит Изменено 23 июля, 2018 пользователем MasterElectric Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба может полярность или фаза не так настроена. пока просто пробую на анализатор нужно еще rx пдп попробовать.не работала с упакованными данными, особо не печалит Лог анализатора у меня нету, только осцилл. Смотрел я им ногу MISO датчика - там действительно тишина. Полярность и фаза у дисплея и у датчика идентичные. Вот мои настройки SPI дисплея и датчика с F103 проца, где всё работает: Дисплей: SPI_Cmd ( SPI1, DISABLE ); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init ( SPI1, &SPI_InitStructure ); SPI_Cmd ( SPI1, ENABLE ); SPI_CalculateCRC ( SPI1, DISABLE ); Датчик: SPI_Cmd ( SPI2, DISABLE ); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init ( SPI2, &SPI_InitStructure ); SPI_Cmd ( SPI2, ENABLE ); SPI_CalculateCRC ( SPI1, DISABLE ); как видно, они идентичные. Попробую ещё настройки пинов сопоставить. У H7 порты, похоже, такие же как и у F4. Этот датчик у меня и на F439 успешно работает, есть с чем сравнивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Датчик заработал, всё гуд. Осталось его только на другой SPI перенести. DMA не делал, пока не нужно, тем более, что ещё надо с UART, таймерами и пр. разобраться. Что касается SPI, остался один простой вопрос - как отправить-принять байт SPI простым опросом? Т.е. то что на F1/F4 делается буквально 4-мя строками кода: // Чтение/запись байта SPI uint8_t bme280_sendbyte ( uint8_t data ) { uint8_t _rxbyte; while ( !( SPI2 -> SR & SPI_SR_TXE ) ); SPI2 -> DR = data; while ( !( SPI2 -> SR & SPI_SR_RXNE ) ); _rxbyte = SPI2 -> DR; return _rxbyte; } // SPI_sendbyte Здесь же, если написать // Чтение/запись байта SPI uint8_t spi1_sendByte ( uint8_t data_out ) { uint8_t data_in = 0; // Disable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1); // Enable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); SPI_PORT->CR2 = 1; // Передать 1 байт // Start transfer SPI_PORT->CR1 |= SPI_CR1_CSTART; while ( !( SPI_PORT -> SR & SPI_SR_TXP ) ); *((__IO uint8_t *)&SPI_PORT->TXDR) = data_out; // Ждать завершения передачи // while ( !(SPI_PORT->SR & SPI_SR_EOT) ); // Ждать завершения приёма while ( !( SPI_PORT -> SR & SPI_SR_RXP ) ); data_in = *((__IO uint8_t *)&SPI_PORT->RXDR); return data_in; } // SPI_sendByte Оно тупо виснет на первом цикле ожидания единицы в SPI_SR_TXP :( До всего остального просто не доходит. Как это сделать правильно? Повторяю - без прерываний. С прерываниями всё хорошо :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба тут наверное ошибочка // Disable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); ну по логике так же как и на прерываниях только постоянным опросом флагов, скорее всего прийдеться опрашивать несколько флагов в вечном цикле, выход из вечного цикла после EOT. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 июля, 2018 Опубликовано 24 июля, 2018 · Жалоба Оно тупо виснет на первом цикле ожидания единицы в SPI_SR_TXP У меня первая выдача данных для передачи идет без проверки (функции с окончанием имени на _p1) - потом перед остальными ожидаем. И конес отидельно (complete) - после чего можно переключать C/D или снимать CS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Да, со SPE опечатка вышла при вставке кода в форум. Сорри ... Вот полный текст: // Чтение/запись байта SPI uint8_t spi1_sendByte ( uint8_t data_out ) { uint8_t data_in = 0; // Disable SPI CLEAR_BIT( SPI_PORT->CR1, SPI_CR1_SPE); MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1); // Enable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); SPI_PORT->CR2 = 1; // Передать 1 байт // Start transfer SPI_PORT->CR1 |= SPI_CR1_CSTART; while ( !( SPI_PORT -> SR & SPI_SR_TXP ) ); *((__IO uint8_t *)&SPI_PORT->TXDR) = data_out; // Ждать завершения передачи // while ( !(SPI_PORT->SR & SPI_SR_EOT) ); // Ждать завершения приёма while ( !( SPI_PORT -> SR & SPI_SR_RXP ) ); data_in = *((__IO uint8_t *)&SPI_PORT->RXDR); return data_in; } // SPI_sendByte На TXP ни разу не висит, теперь виснет на EOT (если его раскомментарить), либо (если прикрыть EOT) на следующем за ним RXP. Genadi Zawidowski, да, я помню, вы выше писали об этом, но на TXP у меня вобщем-то никогда не висло, а когда и висло, то по факту это оказывалось следствием моих же ошибок/экспериментов. Поэтому пока я проверяю всегда этот флаг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Вы же не указываете кол-во передаваемых байт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Вы же не указываете кол-во передаваемых байт? Задал вроде: SPI_PORT->CR2 = 1; // Передать 1 байт После Enable SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterElectric 0 25 июля, 2018 Опубликовано 25 июля, 2018 · Жалоба Да не заметил. Я думаю под себя перепишите. Пример. NRF24_SPI->Connect(); NRF24_SPI->SendByte(0x55); NRF24_SPI->SendByte(0xaa); NRF24_SPI->Disconnect(); функции библиотеки: void TSPI::Connect(void) { // конфигурируем SPI1 this->SPI->CFG1 = SPI_CFG1_MBR_0 | SPI_CFG1_MBR_2 | SPI_CFG1_DSIZE_0 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_2; this->SPI->CFG2 = SPI_CFG2_SSOE | SPI_CFG2_MASTER | SPI_CFG2_AFCNTR; // старт передаем неопределенное кол-во байт this->SPI->CR2 = 0; this->SPI->CR1 |= SPI_CR1_SPE; this->SPI->CR1 |= SPI_CR1_CSTART; } void TSPI::Disconnect(void) { this->SPI->CR1 |= SPI_CR1_CSUSP; this->SPI->CR1 &= ~SPI_CR1_SPE; // еще можно сбросить сам модуль // ... } uint8_t TSPI::SendByte(uint8_t data_out) { uint8_t data_in = 0; while (!(this->SPI->SR & SPI_SR_TXP)); *((__IO uint8_t *)&this->SPI->TXDR) = data_out; // Ждать завершения приёма while(!(this->SPI->SR & SPI_SR_RXP)); data_in = *(volatile uint8_t *) &(this->SPI)->RXDR; return data_in; } P.S. Да первый модуль который я разбираю и столько граблей, то ли нужно глубже вникать, то ли сыроват еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться