本帖最后由 小夏天的大西瓜 于 2024-3-26 14:54 编辑
3、写字节操作
接下来,按照时序的顺序编写方便认读
I2C的读写字节是这么定义的:当时钟线为低电平的时候,允许修改数据线的电平状态,在时钟线为高电平的时候读取数据线的状态。
因为是写操作,因此我们要先将时钟线SCLK拉低,再修改SDIO的值,然后拉高时钟。拉高后,从机就会从总线上读取SDIO的状态,接着一位一位的这么发送。
void I2C_Write(uint8_t dat)
{
pinMode(SDIO_PIN, OUTPUT);
//拉低时钟线后可修改数据线的状态
digitalWrite(SCLK_PIN, 0);
for(int i=0;i<8;i++)
{
digitalWrite(SDIO_PIN, (bool)(dat&0x80));
digitalWrite(SCLK_PIN, 1);//在高电平时候送出数据
dat=dat<<1;
digitalWrite(SCLK_PIN, 0);//拉低准备下一个位的数据发送
}
}
上述代码正描述了这一情况:为了保证最后是低电平,这里将SCLK的第一次拉低放到循环外面,这样可以用最少的执行次数完成一个字节的写任务;同时,结束完一个字节写入后时钟线是低电平状态(时序图中写入的第一个字节为DeviceID,第二个字节为寄存器地址+读写位)。
写完一个字节后,从机会对写入事件进行应答,这个时候主级可以从总线上读取应答信号。
|