2017-11-06 26 views
0

FT4222 디바이스를 사용하여 I2C에서 MAX77651을 프로그래밍하고있다. 나는 기록부에 글을 쓰고 싶다.I2C 쓰기 프로토콜 : 레지스터 쓰기 방법?

레지스터를 읽을 수있어 하드웨어 문제가 없습니다. 레지스터에서 읽으려면 다음과 같이 진행합니다. 먼저 레지스터를 보내고 난 다음 읽고 싶은 것은 그냥 안에 무엇이 있는지 읽습니다.

쓰기 나는 쓰기를 원하는 레지스터를 보내려고하는데 레지스터에 넣고 싶은 데이터를 보낸다. 그러나 내가 이것을 읽었을 때 나는 예상 된 결과를 얻지 못한다. 여기

내가 읽고 쓰기하려고 programm에의 일부입니다

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)를 전송한다.
  • 마스터는 쓰기 비트 (R/W = 0) 다음에 7 비트 슬레이브 주소를 보냅니다.
  • 어드레싱 된 슬레이브는 SDA를 로우로하여 Acknowledge (A)를 어서 트시킨다.
  • 마스터가 8 비트 레지스터 포인터를 보냅니다.
  • 슬레이브는 레지스터 포인터를 수신 확인합니다.
  • 마스터가 데이터 바이트를 보냅니다.
  • 슬레이브가 새 데이터로 업데이트합니다.
  • 슬레이브는 데이터 바이트를 수신 확인하거나 수신 확인하지 않습니다. SDA의 다음 상승 에지는 데이터 바이트를 목표 레지스터에로드하고 데이터가 활성화됩니다.
  • 마스터가 정지 조건 (P) 또는 반복 시작 조건 (Sr)을 보냅니다. P를 발행하면 버스 입력 필터가 1MHz 또는 느린 작동으로 설정됩니다. Sr을 발급하면 의 버스 입력 필터가 현재 상태가됩니다.

당신은 FT4222_I2CMaster_Write()에 두 개의 연속적인 호출로 내부 레지스터에 쓰기를 시도하고 있습니다. 첫 번째 쓰기가 레지스터 주소를 선택하고 두 번째 쓰기가 데이터를로드 할 것으로 예상됩니다. 그러나 그것이 작동하는 방식이 아닙니다. FT4222_I2CMaster_Write()을 호출 할 때마다 START 및 STOP이 전송되므로 연속 호출시 레지스터 주소와 데이터 사이에 STOP/START가 발생합니다. 대신 FT4222_I2CMaster_Write()을 한 번 호출하여 레지스터 주소와 데이터를 제공해야합니다. 어쩌면 이런 식으로.

그런데 읽는 방법이 올바르지 않을 수도 있습니다. MAX77651 데이터 시트의 "단일 레지스터 읽기"섹션을 참조하십시오. FT4222_I2CMaster_WriteEx()에 이어 FT4222_I2CMaster_ReadEx()에 대한 호출로 레지스터 읽기를 구현해야 할 수도 있습니다 (예 : User Guide For LibFT4222의 32 페이지에있는 "I²C 결합 된 메시지 지원"예 참조).

+0

레지스터 주소와 데이터를 동일한 쓰기 명령으로 보내 주셔서 감사합니다. 그것은 해결책이었습니다. –