[KSZ8081RND] simplify read/write functions

This commit is contained in:
ІО-23 Шмуляр Олег 2025-05-10 13:44:32 +03:00
parent 72f04af872
commit b1e57d125b
1 changed files with 54 additions and 60 deletions

View File

@ -2,7 +2,7 @@
#include "lcd.h" #include "lcd.h"
#include "KSZ8081RND.h" #include "KSZ8081RND.h"
#define ETH_MACMIIAR_CR_MASK 0xFFFFFFE3U #define RW_TIMEOUT_US 500000
extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim2;
@ -13,13 +13,13 @@ int KSZ8081RND_run_test(void)
DISPLAY_SET_CURSOR(1, 4); DISPLAY_SET_CURSOR(1, 4);
// enable clocks // enable clocks
__HAL_RCC_ETH_CLK_ENABLE(); __HAL_RCC_ETH_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();
// configure pins // configure pins
GPIO_InitTypeDef GPIO_InitStruct = {}; GPIO_InitTypeDef GPIO_InitStruct = {};
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
@ -29,27 +29,27 @@ int KSZ8081RND_run_test(void)
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// hardware reset KSZ8081RND // hardware reset KSZ8081RND
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_Delay(10); HAL_Delay(10);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET);
HAL_Delay(10); HAL_Delay(10);
// enable PLL and REF_CLK output from KSZ8081RND // enable PLL and REF_CLK output from KSZ8081RND
uint16_t r; uint16_t r;
if (ReadRegister(0x1F, &r)) { if (ReadRegister(0x1F, &r)) {
@ -64,7 +64,7 @@ int KSZ8081RND_run_test(void)
return 1; return 1;
} }
// switch to RMII interface // switch MAC to RMII interface
__HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_SYSCFG_CLK_ENABLE();
SYSCFG->PMC |= (1 << 23); SYSCFG->PMC |= (1 << 23);
(void)SYSCFG->PMC; (void)SYSCFG->PMC;
@ -77,7 +77,7 @@ int KSZ8081RND_run_test(void)
while (ETH->DMABMR & 1) { while (ETH->DMABMR & 1) {
if (TIM2->CNT > (500000 << 4)) { if (TIM2->CNT > (500000 << 4)) {
// MAC software reset timed out -> no REF_CLK output? // MAC software reset timed out -> no REF_CLK output from PHY?
HAL_TIM_Base_Stop(&htim2); HAL_TIM_Base_Stop(&htim2);
display_write_data_seq("SR ERROR"); display_write_data_seq("SR ERROR");
return 1; return 1;
@ -91,52 +91,46 @@ int KSZ8081RND_run_test(void)
int ReadRegister(uint32_t reg, uint16_t *value) int ReadRegister(uint32_t reg, uint16_t *value)
{ {
uint16_t tmpreg1; uint16_t tmpreg1;
uint32_t tickstart;
tmpreg1 = (reg << 6); tmpreg1 = (reg << 6);
tmpreg1 |= 1; tmpreg1 |= 1;
ETH->MACMIIAR = tmpreg1;
tickstart = HAL_GetTick(); ETH->MACMIIAR = tmpreg1;
while ((tmpreg1 & 1) == ETH_MACMIIAR_MB) HAL_TIM_Base_Start(&htim2);
{
if ((HAL_GetTick() - tickstart) > PHY_READ_TO)
{
return HAL_ERROR;
}
tmpreg1 = ETH->MACMIIAR; while (ETH->MACMIIAR & 1) {
} if (TIM2->CNT > (RW_TIMEOUT_US << 4)) {
HAL_TIM_Base_Stop(&htim2);
return 1;
}
}
*value = (uint16_t) (ETH->MACMIIDR); HAL_TIM_Base_Stop(&htim2);
*value = (uint16_t) (ETH->MACMIIDR);
return HAL_OK; return HAL_OK;
} }
int WriteRegister(uint32_t reg, uint16_t value) int WriteRegister(uint32_t reg, uint16_t value)
{ {
uint32_t tmpreg1; uint32_t tmpreg1;
uint32_t tickstart;
tmpreg1 = (reg << 6); tmpreg1 = (reg << 6);
tmpreg1 |= 3; tmpreg1 |= 3;
ETH->MACMIIDR = value; ETH->MACMIIDR = value;
ETH->MACMIIAR = tmpreg1; ETH->MACMIIAR = tmpreg1;
tickstart = HAL_GetTick(); HAL_TIM_Base_Start(&htim2);
while ((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB) while (ETH->MACMIIAR & 1) {
{ if (TIM2->CNT > (RW_TIMEOUT_US << 4)) {
if ((HAL_GetTick() - tickstart) > PHY_WRITE_TO) HAL_TIM_Base_Stop(&htim2);
{ return 1;
return HAL_ERROR; }
} }
tmpreg1 = ETH->MACMIIAR; HAL_TIM_Base_Stop(&htim2);
} return 0;
return HAL_OK;
} }