2016-08-30 6 views
0

저는 PSoC 보드를 처음 사용하여 Digital Compass에서 x, y, z 값을 읽으려고합니다. 그러나 전송 시작시 문제가 있습니다. 나침반 자체.I2C, PSOC를 사용하여 전송 및 수신 바이트를 시작하십시오.

온라인으로 Arduino 튜토리얼 here을 찾았지만 PSoC에는 라이브러리가 없으므로 코드를 복제 할 수 없습니다.

또한 HMC5883L 데이터 시트 here을 읽고 나침반에 바이트를 쓰고 값을 얻으려고했지만 아무 것도받을 수 없었습니다. 내가받은 모든 값은 잘못된 주소에서 값을 읽음으로써 발생할 수있는 0입니다.

곧 답변을 기다리고 있습니다.

답변

0

PSoC는 처음 시작할 때 매우 까다 롭습니다. 대화하려는 장치와 i2c 모듈 자체의 설명서를주의해서 읽어야합니다. 장치에 대한

데이터 시트는 18 페이지의 상태이 링크 :

모든 버스 트랜잭션은 슬레이브 주소 바이트 다음에 시작 순서를 발행 마스터 장치로 시작합니다. 어드레스 바이트는 슬레이브 어드레스를 포함한다. 상위 7 비트 (bits7-1) 및 최하위 비트 (LSb)를 나타냅니다. 주소 바이트의 LSb는 연산이 읽기 (LSb = 1)인지 쓰기 (LSb = 0)인지 지정합니다. 9 번째 클럭 펄스에서 수신 슬레이브 장치는 ACK (또는 NACK)를 발행합니다. 이 버스 이벤트 다음에, 마스터는 쓰기 동작을 위해 데이터 바이트를 보내거나, 슬레이브는 읽기 동작으로 데이터를 클럭 아웃 할 것이다. 모든 버스 트랜잭션은 마스터 시퀀스를 발행하여 종료됩니다.

I2C_MasterWriteBuf 기능을 사용하면 HMC의 데이터 시트에 위와 같은 내용이 모두 포함됩니다. 시작 명령, 해당 ack 다루기, 데이터 처리, 등등. 당신이 지정해야하는 유일한 방법은 그것을 전송하는 방법입니다.

PSoC의 I2C 모듈 데이터 시트를 참조하면 MasterWriteBuf 기능은 장치 주소, 전송할 데이터의 포인터, 전송할 바이트 수 및 "모드"를 가져옵니다. 그것은 문서에서 다양한 전송 모드를 보여줍니다.

I2C_MODE_COMPLETE_XFER 시작에서 중지까지 전체 전송을 수행합니다.
I2C_MODE_REPEAT_START 시작 대신 반복 시작을 보냅니다.
는 시작을 보내고 내가 틀리지 않는 경우에 대한 명령을 중지 중지

MODE_COMPLETE_XFRE 전송하지 않고 전송을 실행 I2C_MODE_NO_STOP.

원하는 경우 I2C_MasterSendStart, WriteByte, SendStop 등에서 직접 호출 할 수도 있습니다. 그러나 writebuf 함수를 호출하는 것이 더 쉽습니다.

꽤 많이 당신은 다음과 같은 코드를 작성해야합니다

// fill in your data or pass in the buffer of data you want to write 
// if this is contained in a function call. I'm basing this off of HMC's docs 
uint8 writeBuffer[3]; 
uint8 readBuffer[6]; 
writeBuffer[0] = 0x3C; 
writeBuffer[1] = 0x00; 
writeBuffer[2] = 0x70; 
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER); 
while((I2C_MasterStatus() & I2C_MSTAT_WR_CMPLT) == 0u) 
{ 
    // wait for operation to finish 
} 

writeBuffer[1] = 0x01; 
writeBuffer[2] = 0xA0; 
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER); 
// wait for operation to finish 

writeBuffer[1] = 0x02; 
writeBuffer[2] = 0x00; 
I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 3, I2C_MODE_COMPLETE_XFER); 
// wait for operation to finish 
CyDelay(6); // docs state 6ms delay before you can start looping around to read 

for(;;) 
{ 
    writeBuffer[0] = 0x3D; 
    writeBuffer[1] = 0x06; 
    I2C_MasterWriteBuf(HMC_SLAVE_ADDRESS, &writeBuffer, 2, I2C_MODE_COMPLETE_XFER); 
    // wait for operation to finish 

    // Docs don't state any different sort of bus transactions for reads. 
    // I'm assuming it'll be the same as a write 
    I2C_MasterReadBuf(HMC_SLAVE_ADDRESS, readBuffer, 6, I2C_MODE_COMPLETE_XFER); 
    // wait for operation to finish, wait on I2C_MSTAT_RD_CMPLT instead of WR_COMPLT 

    // You should have something in readBuffer to work with 

    CyDelay(67); // docs state to wait 67ms before reading again 
} 

난 그냥 그렇다고 쓴 내 머리 위로 떨어져. 그게 효과가 있을지 모르겠지만, 나는 그것이 시작하고 시도하기 좋은 곳이어야한다고 생각합니다. 그들은 또한 내가 생각하는 I2C 예제 프로젝트를 가지고있다.

WriteBuf 기능은 마법 같은 명령처럼 보이지 않습니다. MasterWriteBuf 기능을 마우스 오른쪽 버튼으로 클릭하고 "Find Definition"(프로젝트를 빌드 한 후)을 클릭하면 표시됩니다 당신이하는 일.