|
Кто работал с ADV212 |
|
|
|
Oct 13 2014, 15:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Добрый день всем. Спаяли железо с ADV212, начинаю запускать. Сразу беда - не читаются прямо адресуемые регистры. Точнее читаются, но не те значения что я пишу.
Сигналы подаю по даташиту, дожидаюсь АСК от чипа (он приходит).
Делаю так:
1.Подаю питание (в норме, проверял) 2.Подаю клок 20МГц на МCLK 3.Подаю отрицательный импульс на reset 4.По адресу (прямому) 0xF пишу число 4 5.По адресу (прямому) 0xЕ пишу число 8 6.Читаю адрес 0xE - получаю 0x8B 7.Читаю адрес 0xF - получаю 0xB.
Клок померял прямо на шарике ADV212 - 20МГЦ приходит. Сигналы RD, WR,CS - думаю тоже нормально доходят, поскольку ACK от чипа приходит и на чтение, и на запись. Данные и адреса (он идут с ПЛИС) смотрел сигнал-тапом, все в норме.
При чтении регистров (прямых) всех кроме BUSMODE, MMODE, PLL_HI, PLL_LO ACK от чипа не приходит.
Кто что может посоветовать, что еще проверить? Похоже не запускается PLL внутренняя, есть там какие-то хитрости? Хотя написано, что регистры BUSMODE, MMODE, PLL_HI, PLL_LO не требуют клока вообще. Мысль только менять чип, охота услышать мнение специалиста, работавшего с этим чипом.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
Oct 14 2014, 07:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Alex11 @ Oct 13 2014, 20:32)  Странно это. Чип, конечно, кривенький, но не в этом месте. Прямые регистры читались/писались без вопросов. Из наводящих вопросов - присинхронизовано ли обращение к MCLK? Если ли пауза между снятием reset и обращением? Я уже с трудом помню, что там было. У меня устройство с ним уже четыре года в серии после последних изменений, давно не влезал в проект. По синхронизации - скорее нет, чем да. Клок того что читает и клок самой ADV - от разных PLL, но эти PLL тактируются от одного источника клока. Частоты у них не кратные, поэтому фронты/спады могут попасть как попало. Паузы есть, отлаживаю пошагово, поэтому пауза >1c
|
|
|
|
|
Oct 25 2014, 14:44
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
10 бит дает 1024 уровня 8 бит дает 256 уровней чтобы равномерно распределить 1024 уровня на 256 сохранив тот же диапазон, надо на каждую единицу из 256 подать 1024/256=4 единицы, то есть каждое изменение на 1 вызывает изменение на 4. Другими словами ваши уровни надо умножить на 4, то есть сдвинуть на 2 бита. так что цепляйте их к 11...4, а младшие 4 бита зажимайте в 0. 10 подцепленные к 11..2 - это расширение 10 бит до 12 вы расширите 8 бит до 12.
но тут еще такая фигня, надо поглядеть сам алгоритм кодирования, часто младшие биты сильнее режут, так как считается что в них мало информации, а в основном шум. С другой стороны, если в исходном сигнале есть большие перепады между соседними точками (в случае если вы 8 бит двините к 16, обнулив 8 младших бит) это может вызывать артифакты для некоторых алгоритмов кодирования. Потому, наверное, и ставят в серединку...
|
|
|
|
|
Oct 25 2014, 18:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Golikov A. @ Oct 25 2014, 18:44)  10 бит дает 1024 уровня 8 бит дает 256 уровней чтобы равномерно распределить 1024 уровня на 256 сохранив тот же диапазон, надо на каждую единицу из 256 подать 1024/256=4 единицы, то есть каждое изменение на 1 вызывает изменение на 4. Другими словами ваши уровни надо умножить на 4, то есть сдвинуть на 2 бита. так что цепляйте их к 11...4, а младшие 4 бита зажимайте в 0. 10 подцепленные к 11..2 - это расширение 10 бит до 12 вы расширите 8 бит до 12.
но тут еще такая фигня, надо поглядеть сам алгоритм кодирования, часто младшие биты сильнее режут, так как считается что в них мало информации, а в основном шум. С другой стороны, если в исходном сигнале есть большие перепады между соседними точками (в случае если вы 8 бит двините к 16, обнулив 8 младших бит) это может вызывать артифакты для некоторых алгоритмов кодирования. Потому, наверное, и ставят в серединку... Да это понятно, вопрос был в том, с каких ног чип считывает эти 8 бит, ведь у него для пиксел - интерфейса 16 ног. Ну да с этим разобрался. Другой затык: делаю все по этому алгоритму (картинка). Все проходит нормально - проверяю firmware ID - соответствует. Пытаюсь очистить флаги прерываний - записываю по адресу 6 хост-интерфейса (EIRQFLG) значение 0xFFFF, считываю флаги - как было там значение 15 (0xF) так и остается. Короче, флаги прерываний не сбрасываются. Пытался несколько раз записать 0xffff - результат тот же, флаги остаются в единице. Думал может действительно в code fifo что-то есть - пытаюсь читать direct регистр по адресу 1 (code fifo) - не получаю ACK. Параметры пишу следующие (по адресу 0x57f00, установлен автоинкремент на 16 бит): 0x0100 - pal 422, 8bit 0x0303 - 3level transform, unipolar C, unipolar Y 0x0300 - Codeblock 128x32, irreversible 9x7 0x0000 - No skip fields, no attribute data 0x0101 - target rate control, 0x04ac - image size = 66732bytes 0x0041 - LRCP, HVF pins 0x0002 - quantization factor 1x, JP2 format Все взял из рефренса, дальше че-то тупик.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 26 2014, 20:47
|
Гуру
     
Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965

|
Вот теперь и Вы добрались до глюкавых мест. Вы считываете это все на полной скорости программы или в отладчике? Мы видели зависимость от задержек между записями в регистры, сейчас уже не помню точно между какими. Попробуйте посмотреть на нашу инициализацию, может быть поможет: Код int adv_init(int pal, unsigned long bit_rate, unsigned short skip_field) { const unsigned short *fw = (const unsigned short *)adv_enc_fw; unsigned long fw_addr = ADV2X2_FIRMWARE_START_ADDR; unsigned int len = sizeof(adv_enc_fw)/sizeof(unsigned short); int err; uint32_t reg;
// Load PLL ADV2X2_REG(ADV2X2_PLL_HI) = 0x0008; // Delay 20 uS DELAY_uS(20); // MCLK * 4 = 28.636 MHz * 4 = 114.544 MHz ADV2X2_REG(ADV2X2_PLL_LO) = 0x0004; // Delay 20 uS DELAY_uS(20); // Reboot ADV2X2_REG(ADV2X2_BOOT) = 0x008A; DELAY_uS(1000); // Host bus width = 16 bits, DMA bus width = 32 bits ADV2X2_REG(ADV2X2_BUSMODE) = 0x9; DELAY_uS(1000); // Indirect bus width = 16 bits, 16 bits increment ADV2X2_REG(ADV2X2_MMODE) = 0x5; DELAY_uS(1000);
// Upload firmware // Setup address of firmware ADV2X2_REG(ADV2X2_STAGE) = fw_addr>>16; ADV2X2_REG(ADV2X2_IADDR) = fw_addr; while (len--) { unsigned short data = *fw++; ADV2X2_REG(ADV2X2_IDATA) = (data >> 8) | (data << 8); }
/* Start setting parameters */ adv_enter_set_param();
/* Firmware parameters */ /* SET ENCODE PARAM */ /* VFORMAT, PREC, XFORMLEV, UNI */ /* Video Standard = PAL de-interlaced Precision = 8bit Number of Wavelet Transform Levels = 5 (6 not recommended) Component Polarity = Unipolar (¤R<│_- бвRпвм ¤<п RЎ_Ёе бЁ_- <Rў Ё- з_ бЁ_- < ЄаЁўRc) */ /* NTSC = 8, PAL = 9 */ ADV_IWRITE_32(0x57F00L, (pal) ? 0x09000503L : 0x08000503L);
/* CBSIZE, WKERNEL, STALLPAR, ATTRTYPE */ /* Code Block Dimensions = 64x64 Wavelet Kernel = Reversible 5x3 (lossless) Skip Fields in Encode Mode = 0 Attribute Data Output Format = Do not output attribute data */ if (skip_field > 63) skip_field = 63; reg = 0x02010000 | ((uint32_t)skip_field<<8); debug_print("Reg skip field: "); debug_dump_hex((const char *)®, 4); debug_print("\r\n"); ADV_IWRITE_32(0x57F04L, reg);
/* RCTYPE, RCVAL */ /* Rate Control Algorithm = Target size per video field or image within 5% of RCVAL RCVAL = Size of field or image in bytes PAL 50 field/sec, NTSC = 60 field/sec X = brate/(8*fields) 10MBit 0x010061A8 20Mbit 0x0100C350 */ if (bit_rate > 20*MEGABIT) bit_rate = 20*MEGABIT; else if (bit_rate < 1*MEGABIT) bit_rate = 1*MEGABIT; /* X = brate/(8*fields) */ reg = 0x01000000 | (bit_rate/(8*((pal) ? 50 : 60))); ADV_IWRITE_32(0x57F08L, reg);
/* J2KPROG, PICFG, QFACT, COD_STYLE */ /* JPEG2000 Progression Style = LRCP Pixel Interface Bit Configuration Settings = 0 Quantization Factor = 256/256 factor (1x) Output Code Stream Format = j2c, PPT, PLT, SOP, EPH */ #ifdef EAV_SAV_VMODE ADV_IWRITE_32(0x57F0CL, 0x000100F1L); #else ADV_IWRITE_32(0x57F0CL, 0x004B00F1L); #endif // EAV_SAV_VMODE
//----------------------------------------------------------------------------- /* PMODE1 */ /* Cb/Y/Cr/Y interleaved, 8 bit */ ADV_IWRITE_16(0xFFFF0400L, 0x0005); /* PMODE2 */ #ifdef EAV_SAV_VMODE ADV_IWRITE_16(0xFFFF0448L, 0x0031); #else ADV_IWRITE_16(0xFFFF0448L, 0x003B); #endif // EAV_SAV_VMODE
/* VMODE */ #ifdef EAV_SAV_VMODE ADV_IWRITE_16(0xFFFF044CL, 0x0002); #else ADV_IWRITE_16(0xFFFF044CL, 0x0006); #endif // EAV_SAV_VMODE
/* EDMOD0 register */ ADV_IWRITE_16(0xFFFF1408L, 0x0002);
/* EDMOD1 register */ ADV_IWRITE_16(0xFFFF140CL, 0x0802);
/* Pixel Threshold */ ADV_IWRITE_16(0xFFFF1418L, 0x0080);
/* CODE Threshold */ ADV_IWRITE_16(0xFFFF141CL, 0x0080);
/* Apply parameters */ if (0 != (err = adv_exit_set_param())) return err;
return 0; }
|
|
|
|
|
Oct 27 2014, 11:36
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(Alex11 @ Oct 27 2014, 12:41)  Там дальше в запуске уже все специфично для нашего устройства - запуск DMA. Проверьте еще, запущен ли у Вас фронтенд перед началом инициализации ADV. Без этого он не стартует. Имеете ввиду источник пикселов? Нет, думал сначала готовим все, потом подаем пикселы на кодирование. Не стартует, кстати, что означает? У Вас ввод пикселов на кодирование - через VDATA или HIPI? И кодированный поток можно ли не через ДМА, а просто по флагу трешхолда фифо вытаскивать через хост-интерфейс? Думаю вот не ДМА ли где пытается что-то сделать (или может ждет чего-то)... Спасибо за совет!
|
|
|
|
|
Apr 27 2017, 11:03
|
Группа: Новичок
Сообщений: 3
Регистрация: 27-04-17
Пользователь №: 96 767

|
не могу прочитать данные из региста IDATA косвенной адресации, возможно есть ошибки в коде, не могли бы вы мне помочь?регистр SWFLAG 000000 флаг аппаратного прерывания IERQFLG 0х040F, ACK - приходит Код #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include "define.h"
void USART_Init( unsigned int baud ) { UCSR1A = (1<<U2X1); // Установка скорости связи uint16_t b=0; b = (uint16_t)((F_CPU/(16 * baud))-1); UBRR1H = 0; //(uint8_t)((b>>8)&0x000F); UBRR1L = (uint8_t)b; // Разрешение работы передатчика и приемника, разрешение прерывания по приходу байта UCSR1B = (1<<RXEN1)|(1<<TXEN1); // Установка формата посылки: 8 бит данных, 2 стоп-бита UCSR1C = (1<<UCSZ11)|(1<<UCSZ10)|(1<<USBS1); }
void USART_Transmit( unsigned char data ) { /* Ожидание освобождения буфера передатчика */ while ( !( UCSR1A & (1<<UDRE1)) ); /* Помещение данных в буфер, отправка данных */ UDR1 = data; }
unsigned char USART_Receive( void ) { // Ожидание окончания приема данных while ( !(UCSR1A & (1<<RXC1)) ); // Загрузка принятых данных из буфера return UDR1; }
int main(void) { USART_Init(9600); DDRD|=(1<<3); //PD3 = UART_TXD DDRD&=~(1<<2); //PD2 = UART_RXD DDRG = 0xFF; // Direct address - output DDRB = 0b11110111; // cs,we,rd,reset,irq,PB6,PB7 - output; ack - input CS_1; WE_1; RD_1; RESET_1; IRQ_1; HDATOUT; unsigned long iadd = 0x00050000; unsigned long idata; unsigned char irqflag,i=0; unsigned long parametr[15] = {0x00000010,0x00000002,0x00000002,0x00000003,0x00000003,0x00000000,0x00000000,0x 00000000, 0x00000001,0x00000040,0x00000000,0x00000000,0x00000040,0x00000001,0x0000000 2}; RESET_0; _delay_us(20); RESET_1; _delay_us(20); // PRE - Initialization // DIRRECT_REG(PLL_HI); HDATA_0_7(0x08); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(20); DIRRECT_REG(PLL_LO); HDATA_0_7(0x04); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(20); DIRRECT_REG(BOOT); HDATA_0_7(0x8A); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(BMODE); HDATA_0_7(0x0A); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(MMODE); HDATA_0_7(0x0A); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); // Load FIRMWARE // USART_Transmit('R'); USART_Transmit('e'); USART_Transmit('a'); USART_Transmit('d'); USART_Transmit('y'); USART_Transmit('!'); while(!(UCSR1A & (1<<RXC1))); for(iadd = 0x00050000;iadd <= 0x00051FFF;iadd++) { DIRRECT_REG(IADDR); HDATA_0_7(iadd); HDATA_8_15(iadd >> 8); HDATA_16_23(iadd >> 16); HDATA_24_31(iadd >> 24); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(IDATA); HDATA_0_7(USART_Receive()); HDATA_8_15(USART_Receive()); HDATA_16_23(USART_Receive()); HDATA_24_31(USART_Receive()); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); } // Cheek Firmware // for( iadd = 0x00050000;iadd <= 0x00051FFF;iadd++) { HDATOUT; DIRRECT_REG(IADDR); HDATA_0_7(iadd); HDATA_8_15(iadd >> 8); HDATA_16_23(iadd >> 16); HDATA_24_31(iadd >> 24); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); HDATIN; DIRRECT_REG(IDATA); CS_0; RD_0; _delay_us(10); RD_1;CS_1; _delay_us(1000); } // POST - Initialization //
HDATOUT; DIRRECT_REG(BOOT); HDATA_0_7(0x8D); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(BMODE); HDATA_0_7(0x0A); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(MMODE); HDATA_0_7(0x0A); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); // Set Parameter // for(iadd = 0x00057F00;iadd <= 0x00057F0F;iadd++) { DIRRECT_REG(IADDR); HDATA_0_7(iadd); HDATA_8_15(iadd >> 8); HDATA_16_23(iadd >> 16); HDATA_24_31(iadd >> 24); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); DIRRECT_REG(IDATA); idata = parametr[i]; HDATA_0_7(idata); HDATA_8_15(idata>>8); HDATA_16_23(idata>>16); HDATA_24_31(idata>>24); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); i++; } DIRRECT_REG(EIRQIE); HDATA_0_7(0x00); HDATA_8_15(0x04); CS_0; WE_0; _delay_us(10); WE_1;CS_1; _delay_us(1000); // Hardware Interrupt // IRQ_0; _delay_us(100); IRQ_1; HDATIN; while(!(irqflag==0x04)) { DIRRECT_REG(EIRQFLG); CS_0;RD_0; _delay_us(10); irqflag = PORTF; RD_1;CS_1; _delay_ms(1000); } while(1){ DIRRECT_REG(SWFLAG); CS_0;RD_0; _delay_us(10); RD_1;CS_1; _delay_ms(1000); }
} Код #ifndef DEFINE_H_ #define DEFINE_H_
#define CS 0 #define WE 1 #define RD 2 #define ACK 3 #define IRQ 4 #define RESET 5
#define CS_1 PORTB|=(1<<CS) #define CS_0 PORTB&=~(1<<CS) #define WE_1 PORTB|=(1<<WE) #define WE_0 PORTB&=~(1<<WE) #define RD_1 PORTB|=(1<<RD) #define RD_0 PORTB&=~(1<<RD) #define IRQ_1 PORTB|=(1<<IRQ) #define IRQ_0 PORTB&=~(1<<IRQ) #define RESET_1 PORTB|=(1<<RESET) #define RESET_0 PORTB&=~(1<<RESET)
#define HDATOUT DDRE = 0xFF; DDRF = 0xFF; DDRA = 0xFF; DDRC = 0xFF #define HDATIN DDRE = 0x00; DDRF = 0x00; DDRA = 0x00; DDRC = 0x00 #define HDATA_0_7(x) PORTE = x #define HDATA_8_15(x) PORTF = x #define HDATA_16_23(x) PORTA = x #define HDATA_24_31(x) PORTC = x #define DIRRECT_REG(x) PORTG = x
/* Direct register memory map */ #define PIXEL 0x00 // PIXEL FIFO Access Register #define CODE 0x01 // Compressed Code-Stream Access Register #define ATTR 0x02 // ATTR FIFO Access Register /* Reserved address 0x03 and 0x04 */ #define EIRQIE 0x05 // External Interrupt Enabled #define EIRQFLG 0x06 // External Interrupt Flags #define SWFLAG 0x07 // Software Flag Register (Read Only) #define BMODE 0x08 // Bus Mode Configuration Register #define MMODE 0x09 // Miscellaneous Mode Register #define STAGE 0x0A // Staging Register #define IADDR 0x0B // Indirect Address Register #define IDATA 0x0C // Indirect Data Register #define BOOT 0x0D // Boot Mode Register #define PLL_HI 0x0E // PLL Control Register - High Byte #define PLL_LO 0x0F // PLL Control Register - Low Byte
#endif
|
|
|
|
|
Apr 27 2017, 14:25
|
Группа: Новичок
Сообщений: 3
Регистрация: 27-04-17
Пользователь №: 96 767

|
|
|
|
|
|
Apr 28 2017, 09:15
|
Группа: Новичок
Сообщений: 3
Регистрация: 27-04-17
Пользователь №: 96 767

|
Как считать значение любого из внутренних регистров желательно знать задержки между обращениями Вот например Подаю MCLK POWER записываю регистр PLLLO PLLHI 0x04, 0x08 соответственно BOOT записываю в регистр 0x08A режим no-boot, программный сброс BMODE записываю 0x0A, режим 32 битной шины MMODE записываю 0x0E, режим без авто инкремента адреса
в программе циклически читаю значение внутреннего регистра XTOT значение которого по дефолту 0х064B
в итоге нули хотя ACK всегда приходит
|
|
|
|
|
Apr 28 2017, 21:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(russmakse @ Apr 28 2017, 13:15)  Как считать значение любого из внутренних регистров желательно знать задержки между обращениями Вот например Подаю MCLK POWER записываю регистр PLLLO PLLHI 0x04, 0x08 соответственно BOOT записываю в регистр 0x08A режим no-boot, программный сброс BMODE записываю 0x0A, режим 32 битной шины MMODE записываю 0x0E, режим без авто инкремента адреса
в программе циклически читаю значение внутреннего регистра XTOT значение которого по дефолту 0х064B
в итоге нули хотя ACK всегда приходит Для начала посмотрите, все ли что вы записываете действительно записалось - попробуйте прочитать записанные регистры. Сначала прямые, потом косвенные. Кстати, в моем случае глюки с чтением регистров были связаны с качеством питания 1.5В. Пока не обвесил конденсаторами все ноги 1,5В - внутренняя память регистровая сбоила. Я с 32бит шиной не пробовал, у меня была 16 бит шина. Для выходного потока - JDATA.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|