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