2016-08-30 190 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函数并单击“查找定义”(生成项目后)它将显示你在做什么。