2017-11-06 48 views
0

FT4222デバイスを使用してI2CでMAX77651をプログラミングしています。私はレジスタに書き込むことができるようにしたい。I2C書き込みプロトコル:レジスタへの書き込み方法?

私はレジスタを読み取ることができるので、ハードウェアに問題はありません。レジスタを読み込むには、次のように進んでください。最初にレジスタを送信します。

私は書き込みたいと思っている場所にレジスタを送信しようとしていますが、私はレジスタに入れたいデータを送ります。しかし、私はこれを読んでチェックすると、期待した結果が得られません。ここで

は私が読み書きしようとするプログラムの開発の一部です:

uint8 resultat=0x11; 
uint8 *p_resultat=&resultat; 
int chiffre = 8; 
uint16 bytesToWrite2 = 1; 
uint16 bytesWritten2=1; 
uint8 valeur= 0x06;  // Adress of register 
uint8 *p_valeur=&valeur;  
uint16   slaveAddr = 0x48; 

// ***** reading test of 0x06 : expected value : 0xFF 
FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur, 
bytesToWrite2,&bytesWritten); 

chiffre = FT4222_I2CMaster_Read(ftHandle,slaveAddr,p_resultat,1, &bytesRead); 
printf("The content of the register %02X is : %02X \n " , valeur , resultat); 
printf("reading success if : %d = 0 \n " , chiffre); 

//********** Writting test to the register 0x40 
***********************************************// 

valeur = 0x40; 

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur, 
bytesToWrite2,&bytesWritten); 

valeur = 0x1F; 

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur, 
bytesToWrite2,&bytesWritten); 

//*************** Reading of the register 0x40 
*******************************************// 

valeur= 0x40;   

FT4222_I2CMaster_Write(ftHandle,slaveAddr,p_valeur, 
bytesToWrite2,&bytesWritten); 

chiffre = FT4222_I2CMaster_Read(ftHandle, 
slaveAddr,p_resultat,1, &bytesRead); 

printf("The content of the register %02X 
is : %02X \n " , valeur , resultat); 

printf("reading success if : %d = 0 \n " , chiffre); 

このコードは、レジスタ0x40の中で私の1Fを示すべきであるが、それはそうではないですが、ここで私が得るものです:

The content of the register 06 is : FF 
reading success if : 0 = 0 
The content of the register 40 is : 00 
reading success if : 0 = 0 

私の質問は簡単ですが、私は何をすればいいのですが、どのような順序で正しく登録してください?

Ps:私は、FT4222について主に構成されていて、私の問題を解決するものは何もないので、私のコード全体を入れませんでした。

答えて

1

MAX77651 datasheetの76ページの「単一レジスタへの書き込み」を参照してください。

次のように書き込みバイトプロトコルである:

  • マスタは、スタートコマンド(S)を送信します。
  • マスタは、7ビットのスレーブアドレスに続いて書き込みビット(R/W = 0)を送信します。
  • アドレス指定されたスレーブは、SDAをLに引き下げることによってアクノリッジ(A)をアサートします。
  • マスタは8ビットのレジスタポインタを送信します。
  • スレーブは、レジスタポインタを確認応答します。
  • マスタはデータバイトを送信します。
  • 新しいデータでスレーブが更新されます
  • スレーブは、データバイトを確認応答するかどうかを確認します。 SDAの次の立ち上がりエッジでデータ・バイトがターゲット・レジスタにロードされ、 データがアクティブになります。
  • マスタは、停止条件(P)または繰り返し開始条件(Sr)を送信します。 Pを発行すると、バス入力フィルタが1MHz 以上の動作に設定されます。 Srを発行すると、 のバス入力フィルタが現在の状態になります。

あなたはFT4222_I2CMaster_Write()には2回の連続した呼び出しで内部レジスタへの書き込みしようとしています。最初の書き込みがレジスタアドレスを選択し、2番目の書き込みがデータをロードすることを期待しています。しかし、それはどのように動作するのではありません。 FT4222_I2CMaster_Write()を呼び出すたびにSTARTとSTOPが送信されるため、連続した呼び出しによってレジスタのアドレスとデータの間にSTOP/STARTが発生します。代わりに、FT4222_I2CMaster_Write()への1回の呼び出しを行い、レジスタアドレスとデータの両方を提供する必要があります。このようなものかもしれない。

uint8_t buf[2]; 
buf[0] = register_addr; 
buf[1] = data; 
FT4222_I2CMaster_Write(ftHandle, slaveAddr, buf, 2, &bytesWritten); 

ところで、あなたの読みは正しくないかもしれません。 MAX77651のデータシートの「シングルレジスタからの読み出し」の項を参照してください。 FT4222_I2CMaster_WriteEx()への呼び出しとそれに続くFT4222_I2CMaster_ReadEx()のレジスタ読み取りを実装する必要があります(User Guide For LibFT4222の32ページの「I²C複合メッセージのサポート」の例を参照)。

+0

レジスタアドレスとデータを同じ書き込み命令で送信してくれてありがとう。それが解決策でした。 –

関連する問題