ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
11 июня
1523777 Топик полностью
IBAH (09.06.2025 19:41, просмотров: 85) ответил IBAH на Опять GD32F103, опять SPI. Пауза между прием между передачей байт, на приеме та же хня. Такое ощущение что флаг RXNE выставляется не после 8, а после 16 бит. Кто виноват и что делать?
Ну теперь точно постиг дао. Китай загадка покрытая тайной. Секрет в том что перед проверкой BSY надо проверять TXE. Чтоб я еще с шиной ABP1 связался! 
//
//управление CS 
static inline void W5500_Select(void)
  {
  Set0W5500_CS(); 
  return;
  }
static inline void W5500_Unselect(void)
  {
  Set1W5500_CS(); 
  return;
  }
//Чтение байта
static inline unsigned char W5500_Read8(void)
  {
  LL_SPI_TransmitData8(SPI2, 0x00);            //Начинаем обмен
  while(((SPI2->SR)&SPI_SR_RXNE) == 0){;}      //ожидаем ответ  
  return LL_SPI_ReceiveData8(SPI2);            //считываем ответ, сбрасываем флаг приема
  }
//Запись байта
static inline void W5500_Write8(unsigned char byte)
  {
  while(LL_SPI_IsActiveFlag_TXE(SPI2)==0){;}   //Ожидаем освобождения буфера передачи
  LL_SPI_TransmitData8(SPI2, byte);            //Отправляем данные
  return;
  }
//Занятость SPI
static inline void W5500_WaitReady(void)
  {
  while(LL_SPI_IsActiveFlag_TXE(SPI2)==0){;}   //Ожидаем освобождения буфера передачи
  while(LL_SPI_IsActiveFlag_BSY(SPI2)!=0){;}   //ожидаем конца передачи
  LL_SPI_ReceiveData8(SPI2);                   //сбрасываем флаг приема                
  return;
  }
//

А обмен выглядит так

//
static inline uint16_t  READ16(uint32_t AddrSel)
  {
  W5500_Select(); 
  W5500_Write8((AddrSel) >> 16);
  W5500_Write8((AddrSel) >>  8);
  W5500_Write8((AddrSel) >>  0);
  W5500_WaitReady(); //Ожидаем освобождения SPI
  unsigned short ret = (W5500_Read8()<<8);
  ret  += (W5500_Read8());
  W5500_Unselect();
  return ret;
  }
static inline void     WRITE16(uint32_t AddrSel, const uint16_t wb )
  {
  W5500_Select();    
  W5500_Write8((AddrSel) >> 16);
  W5500_Write8((AddrSel) >>  8);
  W5500_Write8((AddrSel) >>  0);
  W5500_Write8((wb     ) >>  8);
  W5500_Write8((wb     ) >>  0);
  W5500_WaitReady(); //Ожидаем освобождения SPI
  W5500_Unselect();
  return;  
  } 
//