На AT91SAM7X512 реализован датчик, принимающий сигнал с АЦП и передающий данные по сети через tcp протокол.
Проблема: Если к АЦП входу подключить внешний источник напряжения, начинает некорректно работать EMAC интерфейс,
т.е. при опросе функцией EMAC_ReadPhy() статуа, флаг DM9161_LINK_STATUS всегда равен 0 в любом случае, присоединен сетевой кабель или нет.
Без подключенных к АЦП датчиков устройство работает нормально.
Функции для инициализации EMAC Интерфейса взял в одном из примеров AT91SAM7X-EK Software Package 1.5 от ATMEL
Код инициализации EMAC:
Код
static const Pin emacRstPins[] = {BOARD_EMAC_RST_PINS};
static const Pin emacPins[] = {BOARD_EMAC_RUN_PINS};
EMAC_Init(AT91C_ID_EMAC, MacAddress, EMAC_CAF_ENABLE, EMAC_NBC_DISABLE);
DM9161_Init(pDm, EMAC_PHY_ADDR);
if (!DM9161_InitPhy(pDm, BOARD_MCK, emacRstPins, PIO_LISTSIZE(emacRstPins), emacPins, PIO_LISTSIZE(emacPins))) {
return -1;
}
// Auto Negotiate
if (!DM9161_AutoNegotiate(pDm))
return -1;
потом по таймеру с помощью функции EMAC_ReadPhy() я опрашиваю link status.static const Pin emacPins[] = {BOARD_EMAC_RUN_PINS};
EMAC_Init(AT91C_ID_EMAC, MacAddress, EMAC_CAF_ENABLE, EMAC_NBC_DISABLE);
DM9161_Init(pDm, EMAC_PHY_ADDR);
if (!DM9161_InitPhy(pDm, BOARD_MCK, emacRstPins, PIO_LISTSIZE(emacRstPins), emacPins, PIO_LISTSIZE(emacPins))) {
return -1;
}
// Auto Negotiate
if (!DM9161_AutoNegotiate(pDm))
return -1;
Код инициализации АЦП:
Код
static const Pin pinsADC[] = {PINS_ADC};
PIO_Configure(pinsADC, PIO_LISTSIZE(pinsADC));
ADC_Initialize( AT91C_BASE_ADC, AT91C_ID_ADC, AT91C_ADC_TRGEN_DIS, 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, BOARD_MCK, BOARD_ADC_FREQ, 10, 1200);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_0);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_1);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_2);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_3);
ADC_StartConversion(AT91C_BASE_ADC);
PIO_Configure(pinsADC, PIO_LISTSIZE(pinsADC));
ADC_Initialize( AT91C_BASE_ADC, AT91C_ID_ADC, AT91C_ADC_TRGEN_DIS, 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, BOARD_MCK, BOARD_ADC_FREQ, 10, 1200);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_0);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_1);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_2);
ADC_EnableChannel(AT91C_BASE_ADC, ADC_CHANNEL_3);
ADC_StartConversion(AT91C_BASE_ADC);
Кто-нибудь сталкивался с такой проблемой?