libftdi Archives

Subject: Re: baudrate/frequency in bitbang mode

From: Michael Niewöhner <foss@xxxxxxxxxxxxxx>
To: libftdi@xxxxxxxxxxxxxxxxxxxxxxx
Date: Fri, 23 Jul 2021 20:32:28 +0200
Oops, thank you. I had fixed that but forgot to update my mail before sending
...

Diff:
- for (int i = 0; i < 10000; i++) {
+ for (int i = 0; i < 10000;    ) {


On Fri, 2021-07-23 at 11:22 -0400, Michael Plante wrote:
> Haven't studied your full email, but every third sample in your for loop is
> uninitialized. 
> 
> On Tue, Jul 20, 2021, 1:30 PM Michael Niewöhner <foss@xxxxxxxxxxxxxx> wrote:
> > Hi there!
> > 
> > I'm having issues with setting the baudrate/frequency in bitbang mode.
> > 
> > First a general question on `ftdi_set_baudrate`. I wonder what the reason is
> > that libftdi multiplies the baudrate by 4 in bitbang mode. I couldn't find
> > any
> > reasons for that in the datasheet, but I might have just missed something.
> > 
> > For my actual issue, let's have a look at some code:
> > 
> > ```
> > // usual ftdi open and setup
> > // ...
> > 
> > // bitbang buffer generation
> > uint8_t *wave = malloc(10000);
> > for (int i = 0; i < 10000; i++) {
> >   wave[i++] = 0x00;
> >   wave[i++] = 0x01;
> > }
> > 
> > ftdi_set_bitmode(ftdi, 0xff, BITMODE_RESET);
> > ftdi_set_baudrate(ftdi, 200000);
> > ftdi_set_bitmode(ftdi, 0x01, BITMODE_BITBANG);
> > ftdi_write_data(ftdi, wave, 10000);
> > ```
> > 
> > The resulting waveform should have a frequency of 100kHz (200000 baud / 2
> > bits
> > per full cycle). However, my logic analyzer shows 500kHz. Setting the
> > baudrate
> > after mode setup, leads to 2 MHz - that's what I described in my initial
> > question (freq * 4). Still, the frequency is 5 times higher than expected.
> > 
> > For comparison, I have tested this with pyftdi:
> > 
> > ```
> > from pyftdi.gpio import GpioAsyncController
> > g = GpioAsyncController()
> > g.configure("ftdi://ftdi:4232/2", direction=0xff)
> > g.ftdi.reset()
> > g.set_frequency(200000)
> > g.write(b'\x00\x01' * 5000)
> > ```
> > 
> > This time I measure 100kHz!
> > 
> > I had a look at the different implementations for divisor calculations. One
> > difference is, that pyftdi makes use of the /5 divisor in -H ftdis. Also, I
> > get
> > different divisor values but I have not yet compared the calculation yet
> > (but
> > I
> > saw that they differ):
> > 
> > baudrate   libftdi1                    pyftdi
> >   1000     b=  1000, v=12000, i=514    b=   992, v=64771, i=  2
> >  40000     b= 40000, v=  300, i=514    b= 40000, v= 1500, i=514
> > 100000     b=100000, v=  120, i=514    b=100000, v=  600, i=514
> > 200000     b=200000, v=   60, i=514    b=200000, v=  300, i=514
> > 800000     b=800000, v=   15, i=514    b=800000, v=   75, i=514
> > 
> > b = resulting baudrate
> > v = value
> > i = index
> > 
> > In most cases (except 1000 Hz for example, that could be optimized in
> > pyftdi),
> > the `value` is 5 times higher for pyftdi. I'm not yet sure, what that means
> > exactly, since I haven't fully understood the calculations, yet.
> > 
> > Any ideas, what could be wrong here?
> > 
> > 
> > 
> > Michael
> > 
> > 
> > --
> > libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
> > To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   
> > 
> 
> 
> libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
> To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
> 



--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx

Current Thread