我是PSoC板的新手,我正在尝试从数字指南针读取x,y,z值,但我在开始与指南针本身的传输时遇到了问题。
我在here上找到了一些PSoC教程,但是因为Arduino没有这个库,所以我不能复制代码。
此外,我正在读取HMC5883L数据表here,我应该向指南针写入字节并获取值,但我无法接收任何值。我收到的所有值都是零,这可能是因为从错误的地址读取值造成的。
希望能尽快得到你的答复。
发布于 2016-09-14 05:40:52
当你刚开始使用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示例项目可供参考。
另一件需要注意的事情是,如果你用鼠标右键点击MasterWriteBuf函数,然后点击"Find Definition“(在你构建项目之后),它会告诉你它在做什么,这样WriteBuf函数就不像是什么神奇的命令了。
发布于 2019-11-19 08:19:14
以下是PSoC上I2C读写操作的示例。
简单的写操作:
//Dumpy data values to write
uint8 writebuffer[3]
writebuffer[0] = 0x23
writebuffer[1] = 0xEF
writebuffer[2] = 0x0F
uint8 I2C_MasterWrite(uint8 slaveAddr, uint8 nbytes)
{
uint8 volatile status;
status = I2C_MasterClearStatus();
if(!(status & I2C_MSTAT_ERR_XFER))
{
status = I2C_MasterWriteBuf(slaveAddr, (uint8 *)&writebuffer, nbytes, I2C_MODE_COMPLETE_XFER);
if(status == I2C_MSTR_NO_ERROR)
{
/* wait for write complete and no error */
do
{
status = I2C_MasterStatus();
} while((status & (I2C_MSTAT_WR_CMPLT | I2C_MSTAT_ERR_XFER)) == 0u);
}
else
{
/* translate from I2CM_MasterWriteBuf() error output to
* I2C_MasterStatus() error output */
status = I2C_MSTAT_ERR_XFER;
}
}
return status;
}读取操作:
void I2C_MasterRead(uint8 slaveaddress, uint8 nbytes)
{
uint8 volatile status;
status = I2C_MasterClearStatus();
if(!(status & I2C_MSTAT_ERR_XFER))
{
/* Then do the read */
status = I2C_MasterClearStatus();
if(!(status & I2C_MSTAT_ERR_XFER))
{
status = I2C_MasterReadBuf(slaveaddress,
(uint8 *)&(readbuffer),
nbytes, I2C_MODE_COMPLETE_XFER);
if(status == I2C_MSTR_NO_ERROR)
{
/* wait for reading complete and no error */
do
{
status = I2C_MasterStatus();
} while((status & (I2C_MSTAT_RD_CMPLT | I2C_MSTAT_ERR_XFER)) == 0u);
if(!(status & I2C_MSTAT_ERR_XFER))
{
/* Decrement all RW bytes in the EZI2C buffer, by different values */
for(uint8 i = 0u; i < nbytes; i++)
{
readbuffer[i] -= (i + 1);
}
}
}
else
{
/* translate from I2C_MasterReadBuf() error output to
* I2C_MasterStatus() error output */
status = I2C_MSTAT_ERR_XFER;
}
}
}
if(status & I2C_MSTAT_ERR_XFER)
{
/* add error handler code here */
}
}https://stackoverflow.com/questions/39232899
复制相似问题