Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кто работал с ADV212
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
alexPec
Добрый день всем. Спаяли железо с 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 не требуют клока вообще.
Мысль только менять чип, охота услышать мнение специалиста, работавшего с этим чипом.
Alex11
Странно это. Чип, конечно, кривенький, но не в этом месте. Прямые регистры читались/писались без вопросов. Из наводящих вопросов - присинхронизовано ли обращение к MCLK? Если ли пауза между снятием reset и обращением? Я уже с трудом помню, что там было. У меня устройство с ним уже четыре года в серии после последних изменений, давно не влезал в проект.
alexPec
Цитата(Alex11 @ Oct 13 2014, 20:32) *
Странно это. Чип, конечно, кривенький, но не в этом месте. Прямые регистры читались/писались без вопросов. Из наводящих вопросов - присинхронизовано ли обращение к MCLK? Если ли пауза между снятием reset и обращением? Я уже с трудом помню, что там было. У меня устройство с ним уже четыре года в серии после последних изменений, давно не влезал в проект.


По синхронизации - скорее нет, чем да. Клок того что читает и клок самой ADV - от разных PLL, но эти PLL тактируются от одного источника клока. Частоты у них не кратные, поэтому фронты/спады могут попасть как попало.

Паузы есть, отлаживаю пошагово, поэтому пауза >1c
Alex11
А длительности при этом достаточные? Там они определяются в JCLK. При ненастроенной PLL могут быть большими.
alexPec
Цитата(Alex11 @ Oct 14 2014, 20:16) *
А длительности при этом достаточные? Там они определяются в JCLK. При ненастроенной PLL могут быть большими.


Ну вроде понятно стало откуда ноги растут. Сегодня сделал так: активизировал чтение и удерживал RD активным, померял сигналы на шине данных - все линии в норме кроме младших двух разрядов - они болтаются в третьем состоянии. Вызвонил линии прямо на шариках ADV (как раз крайний ряд) - линия целая, пайка в норме. Видно что шарики приплюснуты и пропаяно все хорошо. Похоже на сборке перегрели, другого объяснения пока не вижу. Попробую поменять чип.

Спасибо за помощь!
alexPec
А что чип делает, если уставки размера картики (активные пиксели по вертикали, горизонтали, бланк-интервалы) не совпадают с реальным потоком? И как это отследить?
Alex11
Я не пытался ставить ему кривые параметры, он и при прямых-то еле работает.
alexPec
Цитата(Alex11 @ Oct 24 2014, 22:03) *
Я не пытался ставить ему кривые параметры, он и при прямых-то еле работает.


Я вот хочу подать на него 8 бит и задумался: на примерах для PAL везде 10 бит и цепляются они к VDATA[11..2]. А 8 бит куда подать, на [11..4] или на [9..2] или на [7..0]? Все доки перевыкурил, конкретики не нашел, но везде написано что поддерживается 8- 12- 16- бит. Куда их цеплять- загадка.
Golikov A.
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 младших бит) это может вызывать артифакты для некоторых алгоритмов кодирования. Потому, наверное, и ставят в серединку...
alexPec
Цитата(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

Все взял из рефренса, дальше че-то тупик.
Alex11
Вот теперь и Вы добрались до глюкавых мест. Вы считываете это все на полной скорости программы или в отладчике? Мы видели зависимость от задержек между записями в регистры, сейчас уже не помню точно между какими. Попробуйте посмотреть на нашу инициализацию, может быть поможет:
Код
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 *)&reg, 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;
}
alexPec
Спасибо за код. А можете показать кусок где запускаете ADV? Тут только инициализация. Может там что не так делаю?

У меня в ПЛИС софт-процессор, сейчас для отладки просто программно формирую все сигналы, т.е. тайминги по сигналам очень с запасом. А регистры пробовал и по одному в отладке читать-писать, пробовал и на лету. Результат пока одинаковый.
Alex11
Там дальше в запуске уже все специфично для нашего устройства - запуск DMA. Проверьте еще, запущен ли у Вас фронтенд перед началом инициализации ADV. Без этого он не стартует.
alexPec
Цитата(Alex11 @ Oct 27 2014, 12:41) *
Там дальше в запуске уже все специфично для нашего устройства - запуск DMA. Проверьте еще, запущен ли у Вас фронтенд перед началом инициализации ADV. Без этого он не стартует.



Имеете ввиду источник пикселов? Нет, думал сначала готовим все, потом подаем пикселы на кодирование.
Не стартует, кстати, что означает?
У Вас ввод пикселов на кодирование - через VDATA или HIPI?
И кодированный поток можно ли не через ДМА, а просто по флагу трешхолда фифо вытаскивать через хост-интерфейс? Думаю вот не ДМА ли где пытается что-то сделать (или может ждет чего-то)...

Спасибо за совет!
Alex11
Да, источник пикселов. Я подаю через VData.
Про "висит". У меня при инициализации после заливки и проверки прошивки идет сброс, после которого должно появиться прерывание. Довольно часто его нет. Если данные на вход заранее не подать, то его не будет никогда.
Вытскивать можно, но не в моей схеме. У меня там все под DMA заточено. Давным-давно при отладке я глядел, что данные отдаются. И даже лучше, чем в DMA. Оно у меня висело, а по программному интерфейсу данные отдавались.
alexPec
Цитата(Alex11 @ Oct 30 2014, 21:00) *
Про "висит". У меня при инициализации после заливки и проверки прошивки идет сброс, после которого должно появиться прерывание. Довольно часто его нет. Если данные на вход заранее не подать, то его не будет никогда.


Прерывание по трешхолду code fifo?
russmakse
не могу прочитать данные из региста 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
Alex11
Вы уж меня извините, но я не готов разбираться с Вашими тремя страницами кода, тем более, что программист, который это писал, уволился уже года три как. Если будет конкретный вопрос, попробую подсказать, но мы эту деталь не используем давно.
russmakse
Как считать значение любого из внутренних регистров желательно знать задержки между обращениями
Вот например
Подаю MCLK POWER
записываю регистр PLLLO PLLHI 0x04, 0x08 соответственно
BOOT записываю в регистр 0x08A режим no-boot, программный сброс
BMODE записываю 0x0A, режим 32 битной шины
MMODE записываю 0x0E, режим без авто инкремента адреса

в программе циклически читаю значение внутреннего регистра XTOT значение которого по дефолту 0х064B

в итоге нули хотя ACK всегда приходит
alexPec
Цитата(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.
Alex11
Начните с простого - не меняйте PLL, а прочитайте дефолтные значения прямых регистров, дальше поменяйте PLL и сделайте это еще раз, только потом переходите к косвенным. И посмотрите на все рекомендации из предыдущего поста - они справедливы. Плюс еще качество клока - должен быть аккуратный, без звона, особенно в районе половины амплитуды.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.