ST意法半导体
直播中

张超

7年用户 1295经验值
私信 关注
[问答]

如何在PSOC和ST之间实现I2C通信?

我想在 PSOC 和 ST 之间实现 I2C 通信
我已将 PSoc 配置为 I2C Master,将 ST 配置为 I2C Slave。我已成功将数据从 PSoc 传输到 ST,但无法从 ST 读取数据。
这是有关我的实施的详细信息。
当我在 PSoc 端使用 I2C_Write_Data 函数时,我没有遇到从 PSoC 到 ST 的数据传输问题
我以前没有在 ST 端实现 I2C Slave。我可能使用了错误的 API 或犯了一些配置错误。
我附上了有关实施的图片。(代码和配置)。如果你能阐明这个问题,我将不胜感激。这是我在这个网站上的第一篇文章,所以请忽略我关于这个主题的错误)
祝你今天过得愉快..
1- ST I2C 从机代码

2- St CubeMx I2C 从机配置

3- 赛普拉斯 I2C 主机功能

4- 赛普拉斯 I2C 配置












回帖(1)

田野

2023-1-17 09:25:37
我通过在 PSoC 和 ST 端增加 I2C 函数的超时值并将 PSoC 端的 I2CM_I2C_ACK_DATA 更改为 I2CM_I2C_NAK_DATA 解决了这个问题。我已经将两侧的超时值更新为 0xFF 而不是 200。并且我已经将通信的数据速率设置为 400khz 作为快速模式。这是我用于正确操作的功能。
//PSoC I2C 主机 //
//函数和定义//
#define I2C_TIMEOUT 0xFF
#define SLAVE_ADDR 0x43
void I2C_Write_Data(uint8_t 从机地址,uint8_t I2C_Data)
{
    I2CM_I2CMasterSendStart(从机地址,I2CM_I2C_WRITE_XFER_MODE,I2C_TIMEOUT);
    I2CM_I2CMasterWriteByte(I2C_Data, I2C_TIMEOUT);
    I2CM_I2CMasterSendStop(I2C_TIMEOUT);
}
uint8_t I2C_Read_Data(uint8_t 从机地址)
{
    uint8_t I2C_BUFFER = 0;
    I2CM_I2CMasterSendStart(从机地址,I2CM_I2C_READ_XFER_MODE,I2C_TIMEOUT);
    I2CM_I2CMasterReadByte(I2CM_I2C_NAK_DATA,&I2C_BUFFER,I2C_TIMEOUT);
    I2CM_I2CMasterSendStop(I2C_TIMEOUT);
    返回 I2C_BUFFER;
}
//主功能//
I2C_Write_Data(SLAVE_ADDR, 0xA0);
uint8_t I2C_RECEIVE_BUF = I2C_Read_Data(SLAVE_ADDR); // 返回发送到 ST 从站的相同数据。0xA0。
//ST I2C从机-主要功能//
uint8_t I2C_BUFFER = 0;
而(HAL_I2C_GetState(&hi2cs)!= HAL_I2C_STATE_READY);
HAL_I2C_Slave_Receive(&hi2cs, &I2C_BUFFER, 1, HAL_MAX_DELAY);
开关(I2C_BUFFER)
{
    案例 0xA0:
         uint8_t I2C_TRANSMIT_BUFFER = 0xA0;
         HAL_I2C_Slave_Transmit(&hi2cs, &I2C_TRANSMIT_BUFFER,1,HAL_MAX_DELAY);
    休息;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分