Attiny84A中的USISR、USICR部分字段理解不清楚

问题描述:
利用attiny作为i2c从设备时,发现master发起读后,从这边没有进入到获取设备地址的流程。期望是获取到A0
怀疑这个START中断中的USICR设置不对,不确定USIWM1、USIWM0是否有问题? 还有USICS1、USICS0应该咋设置?

img

【以下回答由 GPT 生成】

我可以帮你解决这个问题。以下是有关Attiny84A中USIWM1、USIWM0、USICS1和USICS0字段的正确设置方式的详细信息:

USIWM1和USIWM0字段是USI控制寄存器(USICR)中的两个字段,用于配置USI的工作模式。这两个字段共同决定了USI的工作模式。以下是USIWM1和USIWM0字段的配置方式:

  • 如果想要使用USI作为I2C从设备,在USICR寄存器中将USIWM1设置为1,USIWM0设置为0。这样可以将USI设置为I2C从模式。

USICS1和USICS0字段用于配置USI时钟源。以下是USICS1和USICS0字段的配置方式:

  • 如果USI作为I2C从设备,可以通过清零USICS1和USICS0字段来将USI设置为外部时钟源模式。这样,USI将使用外部SCL和SDA引脚上的时钟信号。

下面是一段示例代码来配置USICR寄存器:

#include <avr/io.h>

void usi_i2c_init() {
  // 配置USICR寄存器
  USICR = (1 << USIWM1) | (0 << USIWM0);  // 将USI设置为I2C从模式
  USICR &= ~((1 << USICS1) | (1 << USICS0));  // 使用外部时钟源模式
}

int main() {
  // 初始化USI I2C
  usi_i2c_init();

  while (1) {
    // 在这里添加你的代码
  }

  return 0;
}

记得在代码中其他部分添加处理I2C从设备地址以及数据传输的代码。希望这些信息能帮到你。如果你还有其他问题,请随时提问。


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