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

 
 
> TWI в sam7s
Goofy
сообщение Jan 29 2008, 17:11
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Впервые для себя запускаю 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 инициализирован приведённой выше процедурой.
Я не ошибаюсь, считая, что "железные" проблемы никак не влияют на работу модуля внутри?
Пока не идёт речи о корректности передачи, лишь о факте того, что статус регистр не ведёт себя должным образом.
Есть ли вероятность что модуль битый напрочь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Хомяк
сообщение Jan 30 2008, 13:16
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 99
Регистрация: 12-02-07
Из: Свердловск
Пользователь №: 25 269



Я на 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");
      }
    }
  }
}


Сообщение отредактировал Хомяк - Jan 30 2008, 13:18
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 1 2008, 05:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Проблема решилась.
При отсутствии устройства на шине по запрашиваемому адресу, цикл виснит. Буду вводить таймауты.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Feb 4 2008, 18:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Goofy @ Feb 1 2008, 07:03) *
Проблема решилась.
При отсутствии устройства на шине по запрашиваемому адресу, цикл виснит. Буду вводить таймауты.

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

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

Подчеркну, это мой личный выстраданный опыт, никому свое мнение навязывать не буду.
Причем это я на других АРМах грыз (AT91RM9200). Но "чуйствую", что уши у проблемы те же.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Goofy   TWI в sam7s   Jan 29 2008, 17:11
- - Хомяк   Запускал TWI на AT91SAM7A3 проблем не было. Но у м...   Jan 30 2008, 04:06
|- - Goofy   Цитата(Хомяк @ Jan 30 2008, 11:06) Запуск...   Jan 30 2008, 05:27
|- - gladov   Сразу бросается в глаза, что Вы делаете при переда...   Jan 30 2008, 10:49
|- - Goofy   Цитата(gladov @ Jan 30 2008, 17:49) Сразу...   Jan 30 2008, 11:20
||- - gladov   Цитата(Goofy @ Jan 30 2008, 14:20) Принуд...   Jan 30 2008, 12:44
||- - Goofy   Цитата(gladov @ Jan 30 2008, 19:44) А 100...   Jan 30 2008, 12:52
|- - cebotor   Цитата(gladov @ Jan 30 2008, 13:49) Влияе...   Feb 7 2008, 11:58
|- - Terrabyte   всё будет хорошо господа! читайте документ: h...   Feb 7 2008, 11:09
|- - singlskv   Цитата(Terrabyte @ Feb 7 2008, 15:09) всё...   Apr 6 2008, 21:27
- - pan_oleg   вот у меня такая ситуация, на STM32 не может сгене...   Apr 4 2008, 11:40
- - aaarrr   ИМХО, TWI на SAM7 все же неработоспособен. У меня ...   Apr 7 2008, 05:02
|- - Goofy   Цитата(aaarrr @ Apr 7 2008, 13:02) ИМХО, ...   Apr 24 2008, 12:23
||- - aaarrr   Цитата(Goofy @ Apr 24 2008, 16:23) А могл...   Apr 24 2008, 12:35
||- - Goofy   Цитата(aaarrr @ Apr 24 2008, 20:35) Что т...   Apr 24 2008, 12:43
||- - aaarrr   Цитата(Goofy @ Apr 24 2008, 16:43) До как...   Apr 24 2008, 12:49
|- - defunct   Цитата(aaarrr @ Apr 7 2008, 08:02) ИМХО, ...   Jun 16 2008, 22:41
|- - sonycman   Цитата(aaarrr @ Apr 7 2008, 09:02) ИМХО, ...   Jun 19 2008, 12:11
|- - aaarrr   Цитата(sonycman @ Jun 19 2008, 16:11) Да ...   Jun 19 2008, 12:28
- - JeDay   Работал с TWI в SAM7SE. Проблемы которые были в SA...   Apr 8 2008, 10:06
- - aaarrr   Да, исправляют потихоньку. Еще выпущен SAM9261S - ...   Apr 8 2008, 10:31
- - aaarrr   Плохо давили, значит. Не верю С 24-ми и у меня р...   Jun 16 2008, 23:01
|- - singlskv   Цитата(aaarrr @ Jun 17 2008, 02:01) Плохо...   Jan 12 2010, 23:10
|- - aaarrr   Не вижу смысла программно реанимировать откровенно...   Jan 12 2010, 23:50
||- - singlskv   Цитата(aaarrr @ Jan 13 2010, 02:50) Не ви...   Jan 13 2010, 10:08
||- - Terrabyte   Цитата(singlskv @ Jan 13 2010, 13:08) Вся...   Jan 6 2014, 11:07
|- - EugenB2   Цитата(singlskv @ Jan 13 2010, 01:10) А в...   Jan 16 2010, 08:10
- - defunct   Да вроде нормально давил ;> Попробовал фокус с ...   Jun 17 2008, 01:54
- - sonycman   Хм, что-же, приму к сведению, когда буду пробовать...   Jun 19 2008, 14:34
|- - ЕшТ   И снова TWI в AT91SAM7S256. Это нормально, что ста...   Jul 4 2008, 00:51
|- - ЕшТ   товарищи, у кого нибудь вообще тви аппаратный рабо...   Sep 3 2008, 23:09
|- - DmitryM   Цитата(ЕшТ @ Sep 4 2008, 03:09) товарищи,...   Sep 4 2008, 06:06
- - aaarrr   Выше посмотреть не пробовали?   Sep 4 2008, 05:51


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

 


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


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