STM32F207 workaround using ETH RMII + KSZ8031
Posted: Thu Nov 08, 2012 11:35 am
Hello I use STM32f207VCT6 + KSZ8031 + ChibiOS 2.4.2.
I found a problem when using the MAC.
My schema:
STM MCO1 out 25MHz -> PHY XI input
PHY XI multiplied x2 REF_CLK out 50MHz -> STM ETH_RMII_REF_CLK input
If PHY in POWER_DOWN mode -> REF_CLK out 0MHz
The file ChibiOS_2.4.2/os/hal/platforms/STM32/mac_lld.c function mac_lld_start ():
line while (ETH-> DMABMR & ETH_DMABMR_SR) wait indefinitely until STM ETH_RMII_REF_CLK = 0MHz.
my change:
This problem may be with other PHYs.
Thank you.
I found a problem when using the MAC.
My schema:
STM MCO1 out 25MHz -> PHY XI input
PHY XI multiplied x2 REF_CLK out 50MHz -> STM ETH_RMII_REF_CLK input
If PHY in POWER_DOWN mode -> REF_CLK out 0MHz
The file ChibiOS_2.4.2/os/hal/platforms/STM32/mac_lld.c function mac_lld_start ():
Code: Select all
void mac_lld_start(MACDriver *macp) {
unsigned i;
/* Resets the state of all descriptors.*/
for (i = 0; i < STM32_MAC_RECEIVE_BUFFERS; i++)
rd[i].rdes0 = STM32_RDES0_OWN;
macp->rxptr = (stm32_eth_rx_descriptor_t *)rd;
for (i = 0; i < STM32_MAC_TRANSMIT_BUFFERS; i++)
td[i].tdes0 = STM32_TDES0_TCH;
macp->txptr = (stm32_eth_tx_descriptor_t *)td;
/* MAC clocks activation and commanded reset procedure.*/
rccEnableETH(FALSE);
ETH->DMABMR |= ETH_DMABMR_SR;
while(ETH->DMABMR & ETH_DMABMR_SR)
;
/* ISR vector enabled.*/
nvicEnableVector(ETH_IRQn, CORTEX_PRIORITY_MASK(STM32_ETH1_IRQ_PRIORITY));
/* PHY in power up mode.*/
mii_write(macp, MII_BMCR, mii_read(macp, MII_BMCR) & ~BMCR_PDOWN);
....
line while (ETH-> DMABMR & ETH_DMABMR_SR) wait indefinitely until STM ETH_RMII_REF_CLK = 0MHz.
my change:
Code: Select all
void mac_lld_start(MACDriver *macp) {
unsigned i;
/* Resets the state of all descriptors.*/
for (i = 0; i < STM32_MAC_RECEIVE_BUFFERS; i++)
rd[i].rdes0 = STM32_RDES0_OWN;
macp->rxptr = (stm32_eth_rx_descriptor_t *)rd;
for (i = 0; i < STM32_MAC_TRANSMIT_BUFFERS; i++)
td[i].tdes0 = STM32_TDES0_TCH;
macp->txptr = (stm32_eth_tx_descriptor_t *)td;
/* MAC clocks activation and commanded reset procedure.*/
rccEnableETH(FALSE);
/* PHY in power up mode.*/
mii_write(macp, MII_BMCR, mii_read(macp, MII_BMCR) & ~BMCR_PDOWN);
ETH->DMABMR |= ETH_DMABMR_SR;
while(ETH->DMABMR & ETH_DMABMR_SR)
;
/* ISR vector enabled.*/
nvicEnableVector(ETH_IRQn, CORTEX_PRIORITY_MASK(STM32_ETH1_IRQ_PRIORITY));
/* PHY in power up mode.*/
// mii_write(macp, MII_BMCR, mii_read(macp, MII_BMCR) & ~BMCR_PDOWN);
....
This problem may be with other PHYs.
Thank you.