Ну теперь точно постиг дао. Китай загадка покрытая тайной. Секрет в
том что перед проверкой 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; } //