Подскажите в чём может быть проблема.
Раньше использовали 88E1111 и сними не было никаких проблем, за исключением того, что industrial есть только в BGA.
Решили попробовать KSZ9021 и всё перестало работать.
Как это выглядит:
1. Подаю сброс длительностью 20 мс.
2. Инициализирую следующим образом:
CODE
// soft-AVR для ПЛИС, sbr - установка бит, cbr - сброс бит
// PHY_ADDR1 - адрес PHY, PHY_ID = 0x0022
// rd_mdio_1 - чтение из MDIO, wr_mdio_1 - запись в MDIO
ldi temp, 0b00000011
out PHY_ADDR1, temp
ldi temp_2, 2
rcall rd_mdio_1
ldi temp, high(PHY_ID)
cpi temp_0, low(PHY_ID)
cpc temp_1, temp
breq phy_id_ok_1
ldi temp, 0b00000111
out PHY_ADDR1, temp
ldi temp_2, 2
rcall rd_mdio_1
ldi temp, high(PHY_ID)
cpi temp_0, low(PHY_ID)
cpc temp_1, temp
breq phy_id_ok_1
sbi PORTB, LED
phy_id_ok_1:
ldi temp_2, 0
rcall rd_mdio_1
sbr temp_0, low((1<<12) | (1<<8))
sbr temp_1, high((1<<12) | (1<<8))
cbr temp_0, low((1<<15) | (1<<14) | (1<<13) | (1<<11) | (1<<10) | (1<<9) | (1<<6))
cbr temp_1, high((1<<15) | (1<<14) | (1<<13) | (1<<11) | (1<<10) | (1<<9) | (1<<6))
ldi temp_2, 0
rcall wr_mdio_1
ldi temp_2, 4
rcall rd_mdio_1
sbr temp_0, low((1<<13) | (1<<10) | (1<<8) | (1<<6))
sbr temp_1, high((1<<13) | (1<<10) | (1<<8) | (1<<6))
cbr temp_0, low((1<<15) | (1<<11) | (1<<7) | (1<<5))
cbr temp_1, high((1<<15) | (1<<11) | (1<<7) | (1<<5))
ldi temp_2, 4
rcall wr_mdio_1
ldi temp_2, 5
rcall rd_mdio_1
sbr temp_0, low((1<<10))
sbr temp_1, high((1<<10))
cbr temp_0, low((1<<11))
cbr temp_1, high((1<<11))
ldi temp_2, 5
rcall wr_mdio_1
ldi temp_0, low((1<<9) | (1<<8))
ldi temp_1, high((1<<9) | (1<<8))
ldi temp_2, 9
rcall wr_mdio_1
ldi temp_2, 17
rcall rd_mdio_1
cbr temp_0, low((1<<8)| (1<<3))
cbr temp_1, high((1<<8)| (1<<3))
ldi temp_2, 17
rcall wr_mdio_1
ldi temp_2, 28
rcall rd_mdio_1
cbr temp_0, low((1<<7) | (1<<6) | (1<<0))
cbr temp_1, high((1<<7) | (1<<6) | (1<<0))
ldi temp_2, 28
rcall wr_mdio_1
ldi temp_2, 31
rcall rd_mdio_1
sbr temp_0, low((1<<1))
sbr temp_1, high((1<<1))
ldi temp_2, 31
rcall wr_mdio_1
ldi temp_0, low(0x8100)
ldi temp_1, high(0x8100)
ldi temp_2, 11
rcall wr_mdio_1
ldi temp_0, low((1<<8))
ldi temp_1, high((1<<8))
ldi temp_2, 12
rcall wr_mdio_1
ldi temp_0, low(0x8102)
ldi temp_1, high(0x8102)
ldi temp_2, 11
rcall wr_mdio_1
ldi temp_0, low((1<<15))
ldi temp_1, high((1<<15))
ldi temp_2, 12
rcall wr_mdio_1
ldi temp_0, low(0x8107)
ldi temp_1, high(0x8107)
ldi temp_2, 11
rcall wr_mdio_1
ldi temp_0, low((1<<15))
ldi temp_1, high((1<<15))
ldi temp_2, 12
rcall wr_mdio_1
ldi temp_2, 0
rcall rd_mdio_1
sbr temp_0, low((1<<15))
sbr temp_1, high((1<<15))
ldi temp_2, 0
rcall wr_mdio_1
rcall timer20ms
3. При подключении кабеля к хабу или компьютеру линк устанавливается на 1 секунду, а затем пропадает.
Процесс повторяется периодически.
Линк можно установить только если принудительно выставить 10 Мбит.
Если подключить к старой плате на 88EE1111, то начинает линковаться, но линк периодически пропадает примерно раз в 10 секунд.
Схема включения приведена в 9021.pdf
Первый вариант как на схеме.
Во втором я отпаял резисторы 49,9 Ом.
Третий вариант я сделал как в KSZ9021RN Socket Board Schematic rev1.0.pdf
Ни в одном из вариантов не заработало.
Пробовал перепаивать чипы - не помогло.
На двух платах одно и тоже.
Питание проверил: пульсации < 50 мВ.
Подскажите где косяк, а то уже мозги закипают




P.S. На всякий случай приложил рабочую схему на 88E1111.
P.P.S Разводка рабочей и нерабочей платы почти одинаковая.