Hallo liebes Internet!
Ich möchte einen ADC per I2C auslesen und einen DAC beschreiben.
Hierzu habe ich einen FT2232D nach dem BeispielProjekt02 verschaltet:
http://www.ftdichip.com/Support/SoftwareExamples/MPSSE/FT2232C-Proj02_v11.pdf
Und mit Hilfe der d2xx.dll und libMPSSE.dll wie in AppNote 177
beschrieben losprogrammiert.
http://www.ftdichip.com/Support/Documents/AppNotes/AN_177_User_Guide_For_LibMPSSE-I2C.pdf
War eigentlich sehr einfach und das ganze funktioniert soweit auch, nur
macht der FT2232 nach jedem übertragenen Byte eine Pause, so dass ein
übertragenes Byte unabhängig der Taktrate 16ms in Anspruch nimmt, bis er
mit dem nächsten Byte anfängt.
D.h.: 8bit + x = 16ms.
Mein Code ist z.B. folgender:
1 | uint32 write_byte(uint8 slaveAddress, uint8 registerAddress, uint8 data1, uint8 data2) {
|
2 | uint32 bytesToTransfer = 0;
|
3 | uint32 bytesTransfered;
|
4 | bool writeComplete=0;
|
5 | uint32 retry=0;
|
6 |
|
7 | bytesToTransfer=0;
|
8 | bytesTransfered=0;
|
9 | buffer[bytesToTransfer++]=registerAddress; /*PointerRegister*/
|
10 | buffer[bytesToTransfer++]=data1; /*HiByte of wordToSend*/
|
11 | buffer[bytesToTransfer++]=data2; /*LoByte of wordToSend*/
|
12 | status = p_I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT|I2C_TRANSFER_OPTIONS_STOP_BIT);
|
13 | APP_CHECK_STATUS(status);
|
14 |
|
15 | while((writeComplete==0) && (retry<I2C_WRITE_COMPLETION_RETRY)) {
|
16 | bytesToTransfer=0;
|
17 | bytesTransfered=0;
|
18 | buffer[bytesToTransfer++]=registerAddress; /*PointerRegister*/
|
19 | status = p_I2C_DeviceWrite(ftHandle, slaveAddress, bytesToTransfer, buffer, &bytesTransfered, I2C_TRANSFER_OPTIONS_START_BIT|I2C_TRANSFER_OPTIONS_BREAK_ON_NACK);
|
20 | APP_CHECK_STATUS(status);
|
21 |
|
22 | if(bytesToTransfer==bytesTransfered) {
|
23 | writeComplete=1;
|
24 | // printf("... Write done\n");
|
25 | }
|
26 | retry++;
|
27 | }
|
28 | return 0;
|
29 | }
|
Was ziemlich genau dem Muster in FTDIs AppNote 177 entspricht.
Ich kann nun hingehen und per:
1 | channelConf.ClockRate = 400000 //I2C Clock in kHz
|
2 | channelConf.LatencyTimer = 1; //USB latency
|
Den Bus-Takt und die USB-Latenz einstellen.
Der Bus-Takt bestimmt wie schnell ein Byte über den Bus wandert,
allerdings ist zwischen beiden MSBs immer eine Pause von 16ms, der
effektive Bus-Takt liegt also bei satten 500Hz, was definitiv nicht im
Sinne des Erfinders liegen sollte.
Eine Latenz zwischen zwei kompletten I2C-Blöcken könnte ich mir
vielleicht noch erklären, aber zwischen zwei Bytes kann definitiv nicht
im Sinne des Erfinders liegen.
Was mache ich falsch?
Die 16ms können sicher kein Zufall sein... da muss noch irgendwo eine
Einstellung sein, die ich nicht finde.
Hilfe?
Danke!
Gruß, Roland