首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用I2C、PSOC开始发送和接收字节

使用I2C、PSOC开始发送和接收字节
EN

Stack Overflow用户
提问于 2016-08-31 00:41:39
回答 2查看 1.3K关注 0票数 1

我是PSoC板的新手,我正在尝试从数字指南针读取x,y,z值,但我在开始与指南针本身的传输时遇到了问题。

我在here上找到了一些PSoC教程,但是因为Arduino没有这个库,所以我不能复制代码。

此外,我正在读取HMC5883L数据表here,我应该向指南针写入字节并获取值,但我无法接收任何值。我收到的所有值都是零,这可能是因为从错误的地址读取值造成的。

希望能尽快得到你的答复。

EN

回答 2

Stack Overflow用户

发布于 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函数上调用会更容易。

你需要像下面这样写代码:

代码语言:javascript
复制
// 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函数就不像是什么神奇的命令了。

票数 2
EN

Stack Overflow用户

发布于 2019-11-19 08:19:14

以下是PSoC上I2C读写操作的示例。

简单的写操作:

代码语言:javascript
复制
//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;
}

读取操作:

代码语言:javascript
复制
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 */
        }

 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39232899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档