[En-Nut-Discussion] TWI interrupts on AT91SAM7x256 and Ethernut 4.6.5/4.8.0

Ulrich Prinz uprinz2 at netscape.net
Thu Apr 9 23:06:53 CEST 2009


I have to correct myself, sorry.

TwMasterTransact is sending data without a problem. If one needs to send 
and receive data, the sending fails under any condition, regardless of 
the timeout value. If the timout is 0 (infinite) the system hangs.

Measurements of the interrupt routine ( gpios put on a scope) show, that 
after the sending part of one transaction is done, no further interrupt 
is called. So the receiver part does not happen.

I continue to track that issue down.

Best regards and some happy easter
Ulrich

Ulrich Prinz wrote:
> Hi Ajit! 
>  
> I implemented your patches in my local checkout of latest 4.9.x version. I 
> investigate on TwMasterTransact problems too.  
> As far as I can see, this function works well as long as you don't give a 
> timout value. If you do so, TwMasterTransact will send given data out but 
> does not continue to receive data if there is a number given for rxlen. 
>  
> Example: 
>  
> uint8_t PCA_Register = 0;  // Register inside I2C chip for its port 0 
> uint8_t PCA_Keys;          // There are pushubuttons at port 0 
>  
> TwMasterTransact( PCA9555_ADDR, &PCA_Register, 1, %PCA_Keys, 1, 50); 
>  
> On the I2C bus I can see: 
> <ST>0x23, 0x00<SP> 
>  
> Now I call it like this: 
> TwMasterTransact( PCA9555_ADDR, &PCA_Register, 1, %PCA_Keys, 1, 
> NUT_WAIT_INFINITE); 
> And I see: 
> <ST>0x23, 0x00<SP><ST>0x27, 0xkk<SP> 
>  
> where kk depends on the pressed buttons. 
>  
> So there is a problem inside the timeout handling of the I2C. 
>  
> I am not convinced about not keeping up TxMasterRegRead(). This funktion 
> might speed up I2C as it handles registers inside target chips itself 
> wihtout multiple transfers. But I have to read through the atmel bug lists 
> carefully before making a decision  in that. 
>  
> Best regards, Ulrich 
>  
> On Fri, 3 Apr 2009 21:06:19 +0530 (IST), "Ajit Narayanan" 
> <ajitn at inventionlabs.in> wrote: 
>> Hi Harald/Ole, 
>>  
>> I made some progress on this bug. It looks like there are a few issues in 
>> at91_twi.c related to the TWI errata of AT91SAM7x256 (41.4.9.1) which 
> says 
>> The value of CLDIV x 2^CKDIV must be less than or equal to 8191, the 
> value 
>> of CHDIV x 2^CKDIV must be less than or equal to 8191. 
>>  
>> For a client bitrate of 2400, this is not possible; we need a faster 
>> bitrate. This can be changed in TwInit(). I changed it to 4800. 
>>  
>> The return value of the SETSPEED IOCtl is not being checked; this would 
>> have caught the bug earlier: 
>>  
>> -   TwIOCtl(TWI_SETSPEED, &speed) 
>> +   if( TwIOCtl(TWI_SETSPEED, &speed) ) { 
>> +   return -1; 
>> +   } 
>>  
>> Also, the check in the IOCtl (line 344) is incorrect: 
>> -       if (cldiv * (2 << ckdiv) > 8191) { 
>> +       if (cldiv * (1 << ckdiv) > 8191) { 
>>  
>> The bad news is, with all of the above, my application still doesn't work 
>> :-(. But when I check with a scope, I see that at least master 
>> transactions are initiated now. If someone with a Calypso board could 
> give 
>> it a shot and let me know, that would be great. 
>>  
>> It is still a mystery to me why this works with older Nut/OS versions. 
>>  
>>  
>> -Ajit 
>>  
>>  
>>> Ole Reinhardt wrote: 
>>>
>>>> Ok, I had it just running with a client, but the above bug is realy a 
>>>> bug :) 
>>> On a SAM7X? May be there's a difference among MCUs. 
>>>
>>>
>>>> I'll test it here any further if I get a I2C device connected to my 
>>>> olimex board. Until then you might add a hint to the configurator 
> option 
>>>> not to use this code right now... 
>>> No hurry. 
>>>
>>> Unfortunately here is a second problem. Both, the hardware TWI as well 
>>> as the bit banging version are added to the libs. It seems they are 
>>> added by random, depending on the sequence of the referrers. 
>>>
>>> As a temporary workaround one might copy twbbif.c to the application 
>>> directory and add it to the Makefile. 
>>>
>>> Harald 
>>>
>>>
>>> _______________________________________________ 
>>> http://lists.egnite.de/mailman/listinfo/en-nut-discussion 
>>>
>>  
>>  
>>  
>> _______________________________________________ 
>> http://lists.egnite.de/mailman/listinfo/en-nut-discussion
> _______________________________________________
> http://lists.egnite.de/mailman/listinfo/en-nut-discussion



More information about the En-Nut-Discussion mailing list