Всем привет!
1)
Имеется контроллер ColdFire MCF5485.
Пишу простецкое standalone приложение, которое должно в цикле отправлять пакет (42 байта) по FEC0 и FEC1. К письму прикрепил исходники. Отправка пакетов идет в fec_test.c -> fec_test():
Код
int pkt_num = 0;
while( 1 )
{
dprint( "... fec0 pkt%d\n", pkt_num );
fec_sendpacket( &g_fec_driver[ 0 ] );
dprint( "... fec1 pkt%d\n", pkt_num );
fec_sendpacket( &g_fec_driver[ 1 ] );
pkt_num++;
}
После отправки третьего (а иногда и первого) пакета прога сваливается в прерывание 55 (вектор 119) - это CAN1 ERROR. Во-первых, CAN в этот момент выключен. А во-вторых, это прерывание вообще замаскировано и не может быть вызвано! Смахивает на то, что какие-то траблы с отправкой данных по DMA (т.к. при отключенном DMA ошибок нет), но что именно может вызвать замаскированное прерывание, понять не могу.
Кроме того, если я убираю макросы m68k_disable_interrupts() и m68k_enable_interrupts() из функции fec_sendpacket() (код приведен ниже), то все вроде бы как начинает работать. Но где тут логика?
Код
...
// Tell the DMA to continue the transmission
dprint( "TXdma %d\n", sc->dma_tx_channel );
MCD_continDma( sc->dma_tx_channel );
// Increment tx pointer
sc->dma_tx_ptr = ( sc->dma_tx_ptr + 1 ) & FEC_TX_INDEX_MASK;
int level;
m68k_disable_interrupts( level );
volatile int a, b = 0;
for( a = 0; a < 512; a++ ) b++;
m68k_enable_interrupts( level );
for( a = 0; a < 32; a++ ) b++;
...
2)
Другая проблема. Тоже с ethernet'ом. В цикле отправляю кучу пакетов на другой модуль или на писюк. В один прекрасный момент пакет теряется. При этом DMA сообщает об успешной отправке и сам FEC сообщает о том, что пакет ушел. В микросхеме физики (KS8721BLI) никаких ошибок не устанавливается. Но на другой стороне тишина - ничего не получаем.
Может, кто-то сталкивался с подобным, или есть умные мыли на этот счет.
Заранее спасибо!
mcf5485_fec_test.rar ( 60.5 килобайт )
Кол-во скачиваний: 151
Сообщение отредактировал NightRadio - Jan 29 2009, 10:57