2016-08-30 194 views
0

我是新來的PSoC主板,我試圖從數字羅盤讀取x,y,z值,但我在開始傳輸時遇到了問題指南針本身。使用I2C開始發送和接收字節PSOC

我在網上發現了一些Arduino教程here但是由於PSoC沒有庫我不能複製代碼。

另外我正在閱讀HMC5883L的數據表here,我想寫字節到指南針並獲取值,但我無法收到任何東西。我收到的所有值都是零,這可能是由讀取錯誤地址的值引起的。

希望儘快回覆您的答案。

回答

0

當你第一次使用PSoC時,PSoC是一件非常棘手的事情。您需要仔細閱讀您要與之交談的設備和i2c模塊本身的文檔。

數據表的設備,您鏈接18頁的狀態是:

所有總線與主設備發出啓動序列,然後從地址字節開始。 地址字節包含從地址;高7位(位7-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發送重複開始而不是開始。
I2C_MODE_NO_STOP執行傳輸,而不停止

的MODE_COMPLETE_XFRE傳遞將發送啓動和停止命令,如果我沒有記錯。

如果你想要的話,你可以直接調用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函數並單擊「查找定義」(生成項目後)它將顯示你在做什麼。