【Arduino】Arduino Mega2560 I2C速率调节

文章详细描述了在使用ArduinoMega2560和Wire.h库进行I2C通信时,尝试通过setClock()方法改变时钟频率至10kHz遇到的问题。默认的100kHz无法降至10kHz,作者通过查阅库源码和芯片数据手册,发现需要调整TWPS预分频数并修改TWBR的计算方式,最终通过设置TWPS0为1和调整TWBR公式实现了目标频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

使用Arduino Mega2560板,Wire.h库进行I2C通信时,需要调节I2C通信的速率。

setClock()方法

直接使用Wire.h库的setClock()方法修改I2C通信的时钟频率。
setClock()介绍
机翻如下:
setClock()介绍机翻

新的问题

默认I2C通信的时钟频率为100kHz,计划使用10kHz频率时,直接调节上述setClock()函数参数为10000,但用示波器测量得到的SCL频率仍约为40kHz。

解决过程

翻了翻Wire库的代码以及Mega2560芯片的数据手册,截取了部分内容如下:
Wire.cpp片段

void TwoWire::setClock(uint32_t clock)
{
  twi_setFrequency(clock);
}

Wire库还依赖了twi.c文件,twi.c片段

void twi_init(void)
{
  ...
  // initialize twi prescaler and bit rate
  cbi(TWSR, TWPS0);
  cbi(TWSR, TWPS1);
  TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
  // 此处TWI_FREQ在twi.h文件中宏定义为1000000,即IIC默认时钟频率为100kHz
  // #define TWI_FREQ 100000L
  ...
}

void twi_setFrequency(uint32_t frequency)
{
  TWBR = ((F_CPU / frequency) - 16) / 2;
  
  /* twi bit rate formula from atmega128 manual pg 204
  SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
  note: TWBR should be 10 or higher for master mode
  It is 72 for a 16mhz Wiring board with 100kHz TWI */
}

SCL时钟频率计算公式
SCL时钟频率计算公式
TWPS预分频数表
TWPS预分频数表
由上代码片段结合数据手册可知,在初始化时,预分频数为1,TWBR为8位寄存器,其最大值为255,则SCL频率在此情况下最低为 16 M H z 16 + 2 ∗ 255 ≈ 30.4 k H z \frac{16MHz}{16+2*255} \approx 30.4kHz 16+225516MHz30.4kHz
所以为了满足SCL时钟频率达到10kHz的目的,需要将预分频器调节为4分频,即把TWPS0置1,同时修正TWBR计算公式。
最终将twi.c文件中

cbi(TWSR, TWPS0);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

修改为

sbi(TWSR, TWPS0);
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2 / 4;

补充

//-----------位操作定义------------------------
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

可知为sbi(sfr, bit)为将寄存器指定位置1,cbi(sfr, bit)为将寄存器指定位置0。

参考资料

setClock() - Arduino Reference
请教:cbi()/sbi()的用法 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)
ATmega640-1280-1281-2560-2561-Datasheet-DS40002211A.pdf

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值