Цитата(GetSmart @ Nov 12 2009, 13:46)

DCC работает через пины JTAG ?
Меня особенно интересует кто использовал эту фичу в процах LPC2xxx и используется ли при этом прерывания Embedded ICE, DbgCommRx и Embedded ICE, DbgCommTX и как они программно отрабатываются?
Ну, например, так:
Код
RAM BYTE DbgRBuf[HAL_DEBUG_RBUF_SIZE]; // приемный отладочный буфер
RAM BYTE DbgTBuf[HAL_DEBUG_TBUF_SIZE]; // передающий отладочный буфер
RAM volatile DWORD DbgRBeg;
RAM DWORD DbgREnd;
RAM DWORD DbgTBeg;
RAM volatile DWORD DbgTEnd;
RAM BYTE DbgInit;
//________________________________________________________________
//
// Отладочные прерывания от DCC - обмен по JTAG, следует отметить что
// это не полноценные обработчики а всего лишь callbacks из виртуального
// контроллера прерываний
//
void hal_dcc_rx_handler(void)
{
if(hal_status_dcc() & 0x01)
{
DWORD Tmp = DbgRBeg;
//
// Принимаем байт (не слово) из DCC
//
DbgRBuf[Tmp] = (BYTE)hal_read_dcc();
Tmp++;
if (Tmp >= HAL_DEBUG_RBUF_SIZE)
{
Tmp = 0;
}
DbgRBeg = Tmp;
}
//
// Больше нет байтов в DCC
//
VIC_VECTOR = 0;
}
void hal_dcc_tx_handler(void)
{
if ((hal_status_dcc() & 0x02) == 0)
{
DWORD Tmp, Mask;
//
// Передаем 32-битное слово, дополненное нулями
// если нет достаточного числа символов в буфере
//
Tmp = DbgTEnd;
if (DbgTBeg != Tmp)
{
DWORD i, d;
//
// В буфере есть какие-то данные, выбираем и посылаем
//
Mask = 0;
for(i=0; (i<sizeof(DWORD) && (DbgTBeg != Tmp)); i++)
{
d = DbgTBuf[Tmp];
Mask |= d<<(i*8);
Tmp++;
if (Tmp >= HAL_DEBUG_TBUF_SIZE)
{
Tmp = 0;
}
}
DbgTEnd = Tmp;
hal_write_dcc(Mask);
}
else
{
//
// Данных в буфере больше нет, запретим прерывание
//
VIC_IDCR = (1<<IRQ_DCC_TX);
}
}
VIC_VECTOR = 0;
}
DCC работает через JTAG. Мы эту фичу активно пользуем - в программе на DCC завязана процедура типа debug_putch(), а на компе запущена утилита, которая через ByteBlaster шуршит через JTAG и выводит это все в консоль, аналогично сделан и консольный ввод.Оно все прекрасно много лет работает с Samsung 44/24xx, Intel IXPxxx, Атмеловскими AT91SAM7/9, очень удобно - не занимается UART для отладки. Но, блин с LPC23 оказалось неудобно - JTAG при активации энергосбережения отпадает, да и сам JTAG в LPC сбоит периодически при опросе DCC (я думаю проходит помеха и где-то в недокументированном регистре что-то не то происходит - у меня отваливались памяти MAC/USB) в конце-концов, замучались с этой проблемой и именно для LPC23 перешли на UART - благо их достаточно.
Сейчас вот в LPC17 они вообще не сделали "человеческий" DCC. Не, все сделано стандартно, через новейшую навороченную фирменную отладку Cortex-а, но очень уж сложно - я еще не разобрался. Atmel, кстати, в SAM3 повернулся лицом - там сохранили простой DCC.