реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> AT91SAM7S64 и SAA7113H, Реально ли и как?
aaarrr
сообщение Nov 19 2007, 12:22
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Странно: из регистра 0x0F читается 0x0F, а с остальными все в порядке. Похоже на программный глюк. После сброса там точно 0x2a должно быть.
Go to the top of the page
 
+Quote Post
Saratan
сообщение Nov 19 2007, 12:38
Сообщение #17





Группа: Новичок
Сообщений: 8
Регистрация: 2-08-07
Пользователь №: 29 524



Цитата(aaarrr @ Nov 19 2007, 16:22) *
Странно: из регистра 0x0F читается 0x0F, а с остальными все в порядке. Похоже на программный глюк. После сброса там точно 0x2a должно быть.

Код
  
LPC2294CEClear(); //Ресет САА
  for(long i=1;i<1000000;i++)
  {}  
  LPC2294CESet();
  for(long i=1;i<10000000;i++)
  {}  
  
printf( "Tr1 \n\r" );


for(char i=1;i<=23;i++)
{
  saa7113WSub(i, Saa7113InitMass[i]); //Запись байта Saa7113InitMass[i] в регистр i
  
    for(long j=1;j<10000000;j++)
    {}  
    
    printf("%d = %d\n\r", Saa7113InitMass[i], saa7113RSub(i));
  

    while(saa7113RSub(i)!=Saa7113InitMass[i]) //Чтение байта из регистра i
    {
      printf("Error #%d\n\r", i);  
    saa7113WSub(i, Saa7113InitMass[i]);
      for(long j=1;j<1000000;j++)
      {}  
    }
  
  printf("%d\n\r",i);
}


//Функция чтения байта

unsigned char  saa7113RSub(unsigned char Sub)
  {
  I2CSub = Sub; // задать функцию
  wr_rd = 1; //установить признак чтения
  end_rd = 0; //сбросить признак окончания чтения
  I2CONCLR = 0xFF; // сбросить все флаги I2C
  I2CONSET = 0x40; // разрешение I2C
  I2CONSET = 0x20; // передать условие START I2C

  while (end_rd == 0); // ожидать окончания чтения
  return I2DAT; //возврат прочитанного байта
  }

//Функция записи байта

void saa7113WSub(unsigned char Sub, unsigned char data_I2C)
  {
  I2CSub = Sub; // задать функцию
  I2Cwr_byte = data_I2C; // задать байт данных для записи
  wr_rd = 0; //установить признак записи
  I2CONCLR = 0xFF; // сбросить все флаги I2C
  I2CONSET = 0x40; // разрешение I2C
  I2CONSET = 0x20; // передать условие START I2C
  }


//функция-обработчик прерывания от I2C --------------------------------------------
static void I2CInterrupt()
{
  switch(I2STAT)
       {
        case (0x08): // было передано условие START
             I2CONCLR = 0x20; //сброс флага START I2C
             I2DAT=72; //передача адреса устр на шине и признака записи (W)
        break;
        case (0x10): // было передано условие повторный START
             I2CONCLR = 0x20; //сброс флага START I2C
             I2DAT=73; //передача адреса устр на шине и признака чтения (R)
        break;
        case (0x18): // был передан адрес ведомого + W, получен ACK
             //передача адреса
             I2DAT=I2CSub;
        break;
        case (0x28): // был передан байт данных, получен ACK
                   switch(wr_rd)
                     {
                       case (0):
                       //передача байта данных
                       I2DAT=I2Cwr_byte;
                       break;
                       case (1):
                       // передать условие START I2C
                       I2CONSET = 0x20; // повторный START
                       break;
                       default:
                       break;
                     }

        break;
        
        case (0x40): // был передан адрес ведомого + R, получен ACK
        I2CONCLR = 0x04; //сброс флага ACC I2C, чтобы возвратить NOT ACK
        break;
        case (0x58): // был получен байт данных, возвращен ACK
        I2CONSET = 0x10; // передать условие STOP I2C
        end_rd = 1; //установить признак окончания чтения
        break;
        default:
        break;
       }
I2CONCLR = 0x08; // сброс прерывания от I2C
}

Вродебы всё идёт так как и должно итти, я имею в виду чтение там, запись...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2007, 13:25
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



for(long volatile i=1;i<1000000;i++) {} Иначе оптимизатор выбросит весь цикл и задержки не будет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Saratan
сообщение Nov 20 2007, 06:56
Сообщение #19





Группа: Новичок
Сообщений: 8
Регистрация: 2-08-07
Пользователь №: 29 524



Цитата(Сергей Борщ @ Nov 19 2007, 17:25) *
for(long volatile i=1;i<1000000;i++) {} Иначе оптимизатор выбросит весь цикл и задержки не будет.
Да вроде есть... Меняю условие меняется задержка. У меня IAR.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 08:03
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Saratan @ Nov 20 2007, 08:56) *
Да вроде есть... Меняю условие меняется задержка. У меня IAR.
Включите оптимизацию и задержка скорее всего "магически" исчезнет. Ведь внутри этого цикла ничего не происходит, т.е. с точки зрения компилятора он не влияет на программу, значит его можно выкинуть. volatile указывает, что цикл вам все же нужен. А проверить можно не меняя задержку, а посмотрев листинг. А с SAA7113 не работал, по остальному не подскажу.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Saratan
сообщение Nov 20 2007, 08:17
Сообщение #21





Группа: Новичок
Сообщений: 8
Регистрация: 2-08-07
Пользователь №: 29 524



Цитата(Сергей Борщ @ Nov 20 2007, 12:03) *
Включите оптимизацию и задержка скорее всего "магически" исчезнет. Ведь внутри этого цикла ничего не происходит, т.е. с точки зрения компилятора он не влияет на программу, значит его можно выкинуть. volatile указывает, что цикл вам все же нужен. А проверить можно не меняя задержку, а посмотрев листинг. А с SAA7113 не работал, по остальному не подскажу.
Спасибо, буду иметь в виду.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.0163 секунд с 7
ELECTRONIX ©2004-2016