使用attiny84a作为i2c从设备给master发数据时一直失败,可能啥原因呢?

在调试一个master读从机的寄存器的问题。
从机是想把寄存器的值发给master:

data = 0x41;  //设置寄存器的值是 0x41
USIDR = data;
//send data
DDR_USI |= (1<<PORT_USI_SDA);  /* Set SDA as output */
USISR = (0<<USI_START_COND_INT)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      /* Clear all flags, except Start Cond */
(0x0<<USICNT0);                /* set USI to shift out 8 bits        */

但实际上获取到的确实0x3f (一个不知道哪里来的值),通过
量波形,发现有个地方不太对(标?的地方),但不知道怎么修改?

img

【以下回答由 GPT 生成】

问题分析: 根据你提供的代码和问题描述,可以看出你在使用Attiny84a作为I2C从设备时遇到了问题。你希望将寄存器的值发送给Master,但实际上得到的值是0x3F。你通过波形图发现有一个地方不正确,但是不知道如何修复。现在让我来帮助你分析可能的原因并解决这个问题。

可能的原因: 1. 通信速率设置错误: I2C通信的时钟速率需要正确设置才能保证正常通信。请确保Master和Slave都使用相同的时钟频率。可以通过修改USIDR和USI状态寄存器来设置通信速率。

  1. I2C从设备地址设置错误: 在I2C通信中,从设备需要有一个唯一的地址来与主设备进行通信。请确保你正确设置了Attiny84a的I2C从设备地址。可以通过修改USIDR和USI状态寄存器来设置从设备地址。

  2. I2C总线连接问题: 请确保你的I2C总线连接正确。检查SDA和SCL线是否正确连接到Attiny84a以及Master设备上,并且没有短路或接触不良的问题。

  3. I2C总线上拉电阻问题: 在I2C总线上,SDA和SCL线需要上拉电阻来确保正常通信。请确保你正确设置了必要的上拉电阻。

  4. USI配置错误: 代码片段中的USISR寄存器配置可能有误。请检查使用的位和值是否正确,尤其是USICNT0的值设置是否正确。

解决方案: 1. 确认通信速率设置: 在开始通信之前,可以修改USIDR和USI状态寄存器来设置正确的通信速率。通常,需要根据I2C总线的时钟频率来计算并设置USIDR和USI状态寄存器的值。

  1. 确认I2C从设备地址设置: 确保你正确设置了Attiny84a的I2C从设备地址。可以通过修改USIDR和USI状态寄存器来设置从设备地址。可以查阅相关资料来获取正确的从设备地址值。

  2. 检查I2C总线连接: 检查SDA和SCL线是否正确连接到Attiny84a以及Master设备上,并确保没有短路或接触不良的问题。可以使用万用表测量线路上的电阻和连通性来检查连接是否正确。

  3. 确认I2C总线上拉电阻: 确保你正确设置了I2C总线上的上拉电阻。通常,需要在SDA和SCL线上分别接入上拉电阻。可以查阅Attiny84a的数据手册或相关资料来获取正确的上拉电阻值。

  4. 确认USI配置: 检查代码片段中的USISR寄存器配置是否正确。特别是USICNT0的值设置是否正确。可以查阅Attiny84a的数据手册或相关资料来获取正确的位和值配置。

如果你尝试了上述解决方案但问题仍然存在,可能需要更详细的代码和波形图来帮助进一步分析。如果有其他信息或图片,可以提供给我以便更好地帮助你解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^