Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TWI в sam7s
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Goofy
Впервые для себя запускаю TWI на sam7s.

Использована атмеловская lib_twi

Запись
Код
int AT91F_TWI_WriteSingle(const AT91PS_TWI pTwi,
                        int SlaveAddr,
                        char *data)
{
    unsigned int end = 0, status, err=0;

    /* Enable Master Mode */
  //  AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN;

    /* Set the TWI Master Mode Register */
    AT91C_BASE_TWI->TWI_MMR =  (SlaveAddr<<16 ) & ~AT91C_TWI_MREAD;

    /* Write the data to send into THR. Start conditionn DADDR and R/W bit
       are sent automatically */
    AT91C_BASE_TWI->TWI_THR = *data;
    
    AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;

    /* NACK errata handling */
    /* Do not poll the TWI_SR */
    /* Wait 3 x 9 TWCK pulse (max) 2 if IADRR not used, before reading TWI_SR */
    /* From 400Khz down to 1Khz, the time to wait will be in µs range.*/
    /* In this example the TWI period is 1/400KHz */
   AT91F_TWI_WaitMicroSecond (40);

    while (!end)
    {
      status = AT91C_BASE_TWI->TWI_SR;
      if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK)
      {
        err++;
        end=1;
      }
    /*  Wait for the Transmit ready is set */
      if ((status & AT91C_TWI_TXRDY) == AT91C_TWI_TXRDY)
        end=1;
    }
    AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;
    /* Wait for the Transmit complete is set */
    status = AT91C_BASE_TWI->TWI_SR;
    while (!(status & AT91C_TWI_TXCOMP))
      status = AT91C_BASE_TWI->TWI_SR;

    return err;
}


Инициализация (вызывается для 100кГц)
Код
void AT91F_TWI_Open(int TwiClock)
{
    /* Configure TWI PIOs */
    AT91F_TWI_CfgPIO ();

    /* Configure PMC by enabling TWI clock */
    AT91F_TWI_CfgPMC ();

    /* Reset the TWI */
    AT91C_BASE_TWI->TWI_CR = AT91C_TWI_SWRST;

    
    /* Configure TWI in master mode */
    AT91F_TWI_Configure (AT91C_BASE_TWI);


    /* Set TWI Clock Waveform Generator Register */
  //AT91C_BASE_TWI->TWI_CWGR=0x047575;
    AT91F_SetTwiClock(TwiClock);
}


Расчёт делителей
Код
void AT91F_SetTwiClock(int TwiClock)
{
  unsigned int cldiv,ckdiv=1;

  /* CLDIV = ((Tlow x 2^CKDIV) -3) x Tmck */
  /* CHDIV = ((THigh x 2^CKDIV) -3) x Tmck */
  /* Only CLDIV is computed since CLDIV = CHDIV (50% duty cycle) */
          cldiv = ( (MCK/(2*TwiClock))-3 ) / pow(2,ckdiv);
  while (  cldiv> 255 )
  {
   ckdiv++;
   cldiv = ( (MCK/(2*TwiClock))-3 ) / pow(2,ckdiv);

  }
  AT91C_BASE_TWI->TWI_CWGR =(ckdiv<<16)|((unsigned int)cldiv << 8)|(unsigned int)cldiv;
}



Проблема в том, что процедура передачи просто виснит, очевидно не получая из статус регистра TXRDY. TWI инициализирован приведённой выше процедурой.
Я не ошибаюсь, считая, что "железные" проблемы никак не влияют на работу модуля внутри?
Пока не идёт речи о корректности передачи, лишь о факте того, что статус регистр не ведёт себя должным образом.
Есть ли вероятность что модуль битый напрочь?
Хомяк
Запускал TWI на AT91SAM7A3 проблем не было.
Но у меня функция AT91F_SetTwiClock() маленько по другому была.
И еще что цепляется на шину?
Резисторы подтягивающие стоят?
Goofy
Цитата(Хомяк @ Jan 30 2008, 11:06) *
Запускал TWI на AT91SAM7A3 проблем не было.
Но у меня функция AT91F_SetTwiClock() маленько по другому была.
И еще что цепляется на шину?
Резисторы подтягивающие стоят?


Эту функцию я правил чуть чуть, думал, мало ли...

Подтяжка стоит. Только влияет ли это на процесс обновления регистров самого TWI ?
gladov
Сразу бросается в глаза, что Вы делаете при передаче принудительно START|STOP. По DS на at91Sam7X от октября 2007г., этого делать не надо. А может быть и нельзя. Я тоже долго мучил TWI и столкнулся с проблемой - если при передаче принудительно дернуть START, то последующая операция чтения глючит. Ни старт, ни стоп при передаче не надо включать.

Цитата(Goofy @ Jan 30 2008, 08:27) *
Эту функцию я правил чуть чуть, думал, мало ли...

Подтяжка стоит. Только влияет ли это на процесс обновления регистров самого TWI ?


Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки.
Goofy
Цитата(gladov @ Jan 30 2008, 17:49) *
Сразу бросается в глаза, что Вы делаете при передаче принудительно START|STOP. По DS на at91Sam7X от октября 2007г., этого делать не надо. А может быть и нельзя. Я тоже долго мучил TWI и столкнулся с проблемой - если при передаче принудительно дернуть START, то последующая операция чтения глючит. Ни старт, ни стоп при передаче не надо включать.
Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки.


Принудительный старт выставил ради эксперимента. Убрал обратно. Дело в том, что SCL SDA линии красоты ради были подключены через MAX3002 чтобы синхронизировать уровни с 5В, что собственно не диктуется необходимостью (выводы sam7s к 5в терпимы, подтяжка внешняя, 100К припаял для начала). Ради уменьшения глючности отрезал дорожки от MAX3002, соеденил с 5В частью шины напрямую. При инициализации выходит что ключи на ножках sam7s256 открыты, на шине нулевой уровень. Цикл так же виснит. crying.gif
gladov
Цитата(Goofy @ Jan 30 2008, 14:20) *
Принудительный старт выставил ради эксперимента. Убрал обратно. Дело в том, что SCL SDA линии красоты ради были подключены через MAX3002 чтобы синхронизировать уровни с 5В, что собственно не диктуется необходимостью (выводы sam7s к 5в терпимы, подтяжка внешняя, 100К припаял для начала). Ради уменьшения глючности отрезал дорожки от MAX3002, соеденил с 5В частью шины напрямую. При инициализации выходит что ключи на ножках sam7s256 открыты, на шине нулевой уровень. Цикл так же виснит. crying.gif


А 100К не много? Рекомендуют от 5 до 10 ставить. А почему бы не попробовать остановить цикл во время висяка и не посмотреть что лежит в TWI_SR?
Goofy
Цитата(gladov @ Jan 30 2008, 19:44) *
А 100К не много? Рекомендуют от 5 до 10 ставить. А почему бы не попробовать остановить цикл во время висяка и не посмотреть что лежит в TWI_SR?


Обстановка изменилась.
Для sam7s обязательным судя по всему является

AT91C_BASE_PIOA->PIO_MDER=AT91C_PA4_TWCK|AT91C_PA3_TWD;

Резисторы переставил на 10к. Однако верхний уровень сигнала явно не 5 вольт. Зависание прекратилось когда на шину подцепил приёмное устройство. Попытка заглянуть в сигнал осцилографом (25рF, TWI инициализируется под частоту 50гц) снова вешает цикл и ничего не наблюдается. Будем разбираться ...
Хомяк
Я на TWI вешал 24LC256
подтягивал 2к

Привожу свой код
Кварц 16МГц работал на частоте квалца , без ФАПЧ

Код
//==============================================================================
//  Функция             : AT91F_SetTwiClock
//  Описание            :
//  входные параметры   :
//  выходные параметры  :
//==============================================================================
void AT91F_SetTwiClock(void)
{
  int sclock;

  /* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/

  sclock = (10*MCK /AT91C_TWI_CLOCK);
  if (sclock % 10 >= 5)
      sclock = (sclock /10) - 5;
  else
      sclock = (sclock /10)- 6;
  sclock = (sclock + (4 - sclock %4)) >> 2;    // div 4

  AT91C_BASE_TWI->TWI_CWGR    = ( 1<<16 ) | (sclock << 8) | sclock;
}
//==============================================================================
//  Функция             : AT91F_TWI_Open
//  Описание            :
//  входные параметры   :
//  выходные параметры  :
//==============================================================================
void AT91F_TWI_Open(void)
{
  AT91F_TWI_CfgPIO();                     // configure TWI PIOs
  AT91F_TWI_CfgPMC();                     // enable clock TWI
  AT91F_TWI_Configure (AT91C_BASE_TWI);   // configure in MASTER mode
  AT91F_SetTwiClock();
}
//==============================================================================
//  Функция             : AT91F_TWI_WriteByte
//  Описание            :
//  входные параметры   :
//  выходные параметры  :
//==============================================================================
int AT91F_TWI_WriteByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2send, int nb)
{
  unsigned int status,counter=0,error=0;

  // Set TWI Internal Address Register
  if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;

  // Set the TWI Master Mode Register
  pTwi->TWI_MMR = mode & ~AT91C_TWI_MREAD;
  if(nb <2)
  {
    pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP;
    pTwi->TWI_THR = *data2send;
  }
  else
  {
    // Set the TWI Master Mode Register
    for(counter=0;counter<nb;counter++)
    {
      pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
      if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
      status = pTwi->TWI_SR;
      if ((status & ERROR) == ERROR) error++;
      while (!(status & AT91C_TWI_TXRDY))
      {
        status = pTwi->TWI_SR;
        if ((status & ERROR) == ERROR) error++;
      }
      pTwi->TWI_THR = *(data2send+counter);
   }
  }
  status = pTwi->TWI_SR;
  if ((status & ERROR) == ERROR) error++;
  while (!(status & AT91C_TWI_TXCOMP))
  {
    status = pTwi->TWI_SR;
    if ((status & ERROR) == ERROR) error++;
  }
  return error;
}
//==============================================================================
//  Функция             : AT91F_TWI_ReadByte
//  Описание            :
//  входные параметры   :
//  выходные параметры  :
//==============================================================================
int AT91F_TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data, int nb)
{
  unsigned int status,counter=0,error=0;

  // Set TWI Internal Address Register
  if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;

  // Set the TWI Master Mode Register
  pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;

  // Start transfer
  if (nb == 1)
  {
    pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP;
    status = pTwi->TWI_SR;
    if ((status & ERROR) == ERROR) error++;
    while (!(status & AT91C_TWI_TXCOMP))
    {
      status = pTwi->TWI_SR;
      if ((status & ERROR) == ERROR) error++;
    }
    *(data) = pTwi->TWI_RHR;
   }
   else
   {
     pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
     status = pTwi->TWI_SR;
     if ((status & ERROR) == ERROR) error++;

     // Wait transfer is finished
     while (!(status & AT91C_TWI_TXCOMP))
     {
       status = pTwi->TWI_SR;
       if ((status & ERROR )== ERROR) error++;
        if(status & AT91C_TWI_RXRDY)
        {
      *(data+counter++) = pTwi->TWI_RHR;
      if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
    }
     }
   }
   return 0;
}
//==============================================================================
//  Функция             :
//  Описание            :
//  входные параметры   :
//  выходные параметры  :
//==============================================================================
void TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, char *data, int nb)
{
  unsigned int status,counter=0;
  // Set TWI Internal Address Register
  // without internal address ??????
  //if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;

  // Set the TWI Master Mode Register
  // Use MS 7 bits as mode ??????
  pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;

  // Start transfer
  if (nb == 1)
  {
    pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP;
    status = pTwi->TWI_SR;
    //if ((status & ERROR) == ERROR) error++;
    while (!(status & AT91C_TWI_TXCOMP));
    *(data) = pTwi->TWI_RHR;
  }
  else
  {
    pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
    status = pTwi->TWI_SR;
    // Wait transfer is finished
    while (!(status & AT91C_TWI_TXCOMP))
    {
      AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_1");
      if(status & AT91C_TWI_RXRDY)
      {
         *(data+counter++) = pTwi->TWI_RHR;
         AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_2");
         if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
         //AT91F_DBGU_Printk("\n\rTEST_AT91F_TWI_ReadByte_3");
      }
    }
  }
}
Goofy
Проблема решилась.
При отсутствии устройства на шине по запрашиваемому адресу, цикл виснит. Буду вводить таймауты.
Ruslan1
Цитата(Goofy @ Feb 1 2008, 07:03) *
Проблема решилась.
При отсутствии устройства на шине по запрашиваемому адресу, цикл виснит. Буду вводить таймауты.

Какое-то время назад тут уже подымалась тема TWI. Тема для меня больная, но повторяться не буду, только выводы:

Хотите иметь надежное устройство- делайте софтовый TWI. Чтобы Ваше устройство работало так, как хотите Вы и не зависало от каждой иголки на шине.

Подчеркну, это мой личный выстраданный опыт, никому свое мнение навязывать не буду.
Причем это я на других АРМах грыз (AT91RM9200). Но "чуйствую", что уши у проблемы те же.
Terrabyte
всё будет хорошо господа! читайте документ:
http://electronix.ru/forum/index.php?act=A...st&id=16553
cebotor
Цитата(gladov @ Jan 30 2008, 13:49) *
Влияет. Встречал реализацию (не помню в каком камне), когда аппаратный i2c сильно глючил без подтяжки.

а не в процессорах ли ST ?
в подтверждение могу сказать что на STM32 при инициализации TWI в случае неправильной подтяжки
мастер встает в такое кривое состояние что потом никогда не может сгенерировать start condition
pan_oleg
вот у меня такая ситуация, на STM32 не может сгенерировать start,
подтяжка 5 к, на шине еепромка, виснет только при чтении из еепромки,
что поменять с подтяжкой?
singlskv
Цитата(Terrabyte @ Feb 7 2008, 15:09) *
всё будет хорошо господа! читайте документ:
http://electronix.ru/forum/index.php?act=A...st&id=16553
Terrabyte а может быть Вы сможете подитожить инфу по работе i2c ?
и выложить ее на всеобщее обозрение в виде FAQ ?
Готов выдать Вам еще несколько мыслей, но хотелось бы на выходе получить готовую
апликайшен про то как нужно пользоваться i2c на samxxxxx....
Сам буду ей пользоваться..... smile.gif
aaarrr
ИМХО, TWI на SAM7 все же неработоспособен. У меня есть несколько "почти работающих" вариантов, но все они благополучно сыпятся на попытке общения с SAA7113. Софтверный во сто крат лучше, поверьте smile.gif
JeDay
Работал с TWI в SAM7SE. Проблемы которые были в SAM7S убрали.
Модуль немного доработан и содержит дополнительные биты управления. Но это не сильно утешает т.к. внешняя шина не всегда нужна..
aaarrr
Да, исправляют потихоньку. Еще выпущен SAM9261S - урезана SRAM и заменен TWI.
Goofy
Цитата(aaarrr @ Apr 7 2008, 13:02) *
ИМХО, TWI на SAM7 все же неработоспособен. У меня есть несколько "почти работающих" вариантов, но все они благополучно сыпятся на попытке общения с SAA7113. Софтверный во сто крат лучше, поверьте smile.gif


А могли бы поделиться сим софтварным и2с ?
С ходу ничего не удалось нагуглить
aaarrr
Цитата(Goofy @ Apr 24 2008, 16:23) *
А могли бы поделиться сим софтварным и2с ?
С ходу ничего не удалось нагуглить

Что там гуглить? Работы на пару часов максимум.

Нажмите для просмотра прикрепленного файла
Goofy
Цитата(aaarrr @ Apr 24 2008, 20:35) *
Что там гуглить? Работы на пару часов максимум.

Нажмите для просмотра прикрепленного файла



Спасибо большое! У меня бы заняло намного больше времени... И получилось бы хуже.
До каких частот можно спокойно раскачивать ?
aaarrr
Цитата(Goofy @ Apr 24 2008, 16:43) *
До каких частот можно спокойно раскачивать ?

Не ставил себе задачи добиться максимальной скорости. Этот пример дает около 100kHz @ 48MHz MCK, вполне можно получить и 400.
defunct
Цитата(aaarrr @ Apr 7 2008, 08:02) *
ИМХО, TWI на SAM7 все же неработоспособен.

Добрался до аппаратного TWI модуля в SAM7S. Софтверный драйвер непозволительная роскош в моем случае.
На мой взгляд работать куда удобнее чем со стандартным филипковым I2C (портировал драйвер с LPC на SAM7)

Проверил с рамтроновскими FM'ками и at24 серией, а также c мегой в качестве слейва, да и просто без ничего на линии. Давил линию принудительно в 0. работает..
400kHz полет нормальный, TWI модуль не подвисает.
(до "Soft reset" дело ни разу не дошло).

PS: подтяжки всегда ставлю 1k (с некоторыми девайсами обеспечивает 1Mhz трансфер).
aaarrr
Плохо давили, значит. Не верю smile.gif

С 24-ми и у меня работал, но отвертка, воткнутая между SDA и SCL, с какой-то попытки модуль все равно завешивала.
defunct
Да вроде нормально давил ;>
Попробовал фокус с отверткой (закоротить линии) - сработал soft reset и шина задышала себе дальше.

В атаче драйвер "как есть".
пример применения:
Код
void CheckExtStorage(void)
{
    U8 addr = 0xA0;
    U8 rBuf[16];

    printf("Discovering storages connected to I2C bus\n");
    while (addr < 0xA8)
    {
        printf("storage 0x%x...", addr);
        i2c_MemTransfer( addr + SLA_R, 0x00, sizeof(rBuf), rBuf);
        if (i2c_WaitCompleteOperation() == ACK)
            printf("PRESENT");
        else
            printf("NOT present");
        printf("\n");
        addr += 2;
    }

}

....
i2c_Init();
CheckExtStorage();
sonycman
Цитата(aaarrr @ Apr 7 2008, 09:02) *
ИМХО, TWI на SAM7 все же неработоспособен. У меня есть несколько "почти работающих" вариантов, но все они благополучно сыпятся на попытке общения с SAA7113. Софтверный во сто крат лучше, поверьте smile.gif


Да ладно, ребят, что-то ужасы какие-то рассказываете.
Как может быть неработоспособным модуль серийного девайса?
Может быть, просто есть какие-то нюансы, которые должны прекрасно обходиться.

Ну а если "тыкать" отвёрткой или паяльником по выводам работающего чипа, так тут не только TWI заглючит, а вообще всё погореть может... smile.gif
aaarrr
Цитата(sonycman @ Jun 19 2008, 16:11) *
Да ладно, ребят, что-то ужасы какие-то рассказываете.

Ужасы.

Цитата(sonycman @ Jun 19 2008, 16:11) *
Как может быть неработоспособным модуль серийного девайса?

Может. У SAM7 это один из PLL и I2C slave.

Цитата(sonycman @ Jun 19 2008, 16:11) *
Может быть, просто есть какие-то нюансы, которые должны прекрасно обходиться.

Поверьте, я с атмеловскими ARM'ами имею дело уже 7 лет, и бился с I2C до последнего, но эта ж. может работать лишь с ограниченным набором I2C устройств.
sonycman
Хм, что-же, приму к сведению, когда буду пробовать.
Спасибо smile.gif

ЗЫ: может, мне повезёт, и с моим девайсом проблем не возникнет...
ЕшТ
И снова TWI в AT91SAM7S256. Это нормально, что стандартный пример AT91SAM7S256-BasicTWI-IAR4_30A-1_21 не хочет компилится?
Говорит
Код
Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 74
Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 74
Error[Pe018]: expected a ")" D:\iararm5\AT91SAM7S-Interrupt\Src\lib_twi.c 78

и так далее, до 130 строчки, на безобидные с виду if ((status & ERROR) == ERROR) error++;.

Работа только в режиме Master, компилер IAR ARM 5.11.
wacko.gif
ЕшТ
товарищи, у кого нибудь вообще тви аппаратный работает в сам7с? скиньте кусочки кода с функциями плиз. Родные с примера что-то не работают. компилятор ИАР 5.10
aaarrr
Выше посмотреть не пробовали?
DmitryM
Цитата(ЕшТ @ Sep 4 2008, 03:09) *
товарищи, у кого нибудь вообще тви аппаратный работает в сам7с? скиньте кусочки кода с функциями плиз. Родные с примера что-то не работают. компилятор ИАР 5.10


У меня работает. Периферия Texas TLV320, EEProm, ForteMedia.
CrossWorks 1.5
Работа по прерываниям, обработчик на асме.
singlskv
Цитата(aaarrr @ Jun 17 2008, 02:01) *
Плохо давили, значит. Не верю smile.gif
С 24-ми и у меня работал, но отвертка, воткнутая между SDA и SCL, с какой-то попытки модуль все равно завешивала.
А все таки TWI победить можно... даже при связи с слейвами на МК...

во-первых нужно ставить обязательно PIO_MDER на SCL и SDA
ну а дальше просто при подвисании шины(таймауйт например) выключаем TWI
и через PIO щелкаем 9 тактов на SCL на макс скорости(400КГц)
включаем снова TWI и все ОК.

и никакая отвертка между SDA и SCL ничто не завесит... smile.gif
aaarrr
Не вижу смысла программно реанимировать откровенно корявое железо. Ерраты и раздела Troubleshooting AT91-AN01 должно быть достаточно для принятия единственно верного решения - отказаться от TWI.
В противном случае придется подтачивать напильником драйвер под некоторые слейвы. А в какой-то момент даже для самого супер-пупер круто написанного драйвера такая необходимость все равно возникнет, и не факт, что потраченные на разборки часы приведут к положительному результату. Поверьте моему опыту.
singlskv
Цитата(aaarrr @ Jan 13 2010, 02:50) *
Не вижу смысла программно реанимировать откровенно корявое железо. Ерраты и раздела Troubleshooting AT91-AN01 должно быть достаточно для принятия единственно верного решения - отказаться от TWI.
В противном случае придется подтачивать напильником драйвер под некоторые слейвы. А в какой-то момент даже для самого супер-пупер круто написанного драйвера такая необходимость все равно возникнет, и не факт, что потраченные на разборки часы приведут к положительному результату. Поверьте моему опыту.
Вся эта возня с TWI от безысходности, нужно поддерживать старые разработки.
Тут на объекте поймали эфект(видимо помехи) сходный с закороткой отверткой SDA и SCL,
модуль TWI просто подвисал после длительной работы.
Использовать софтовый I2C там невозможно из-за довольно приличного трансферта который
должен идти в фоне.
Пришлось искать решение по реанимированию TWI.

В новых разработках TWI на SAM7 просто не используем, и никому не посоветую использовать.
EugenB2
Цитата(singlskv @ Jan 13 2010, 01:10) *
А все таки TWI победить можно... даже при связи с слейвами на МК...

во-первых нужно ставить обязательно PIO_MDER на SCL и SDA
ну а дальше просто при подвисании шины(таймауйт например) выключаем TWI
и через PIO щелкаем 9 тактов на SCL на макс скорости(400КГц)
включаем снова TWI и все ОК.

и никакая отвертка между SDA и SCL ничто не завесит... smile.gif

Такого метода по реанимации TWI я еще не пробывал )), кстати, у меня была дурная идея переписать весь SAM7S TWI под прерывания, чтобы избавиться от глюков. В итоге сделал софтовый и все работает без проблем. Аппаратный же... после зависания никаким образом, даже ресетом всего усройства, не выводился из этого состояния, тока выключение питания ((.
Terrabyte
Цитата(singlskv @ Jan 13 2010, 13:08) *
Вся эта возня с TWI от безысходности, нужно поддерживать старые разработки.
Тут на объекте поймали эфект(видимо помехи) сходный с закороткой отверткой SDA и SCL,
модуль TWI просто подвисал после длительной работы.
Использовать софтовый I2C там невозможно из-за довольно приличного трансферта который
должен идти в фоне.
Пришлось искать решение по реанимированию TWI.

В новых разработках TWI на SAM7 просто не используем, и никому не посоветую использовать.


С микросхемой часов PCF__ TWI заработал, извиняюсь за стиль.
Благодаря документации находящейся по ссылке "Описание модулей SAM", в теме NACK_in_TWI_SR
но программно только как Slave.
В последних версиях at91 с I2C не должно быть проблем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.