早已准备用沁恒CH579开发板来做SC8905EVM的I2C通讯实验,这样做一个实验可以完成两个评测。但调试CH579的I2C通讯花费了不少时间,昨天才调试成功,于是立马来做SC8905的I2C通讯实验。
从使用指南和数据手册中得知SC8905评测板支持100K和400K两种速度的I2C通讯标准,其写地址为0xC4,读地址为0xC5。10个寄存器的地址依次为01H~0AH(如下图):
本次首先实验读取寄存器的数据,实验的照片如下,通过外接电源给VBUS供电,万用表读取VBAT的电压:
下面是读写寄存器的代码,读取的数据存放在SC_Buff[10]数组中,本次仅测试读取寄存器,尚未测试写寄存器:
#include "sc8905.h"
#include "i2c.h"
extern uint8_t SC_Buff[8];
/******************************************************************************************
* 函数名称: SC8905_read()
* 功能说明: 读取SC8905寄存器数据
* 输 入: 无
* 输 出: 无
******************************************************************************************/
uint8_t SC8905_read(void)
{
uint8_t i = 0;
SI2C_Start(); //产生起始信号
SI2C_Send(SC8905_ADDR); //发送SC8905芯片地址及读写位,0表示写(先写入起始地址))
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 2;
}
SI2C_Send(1); //从0x01地址开始读寄存器
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 3;
}
SI2C_Start(); //产生Repeated Start
SI2C_Send(SC8905_ADDR|1); //发送SC8905芯片地址及读写位,1表示读
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 4;
}
for(i=0; i<10; i++) //从起始地址开始连续读取10个字节的数据
{
SC_Buff[i] = SI2C_Receive();
// SI2CDoAck();
}
SI2C_Stop(); //产生停止信号
return 0;
}
/******************************************************************************************
* 函数名称: SC8905_write()
* 功能说明: 将数据写入SC8905寄存器
* 输 入: 无
* 输 出: 无
******************************************************************************************/
uint8_t SC8905_write(void)
{
uint8_t i = 0;
SI2C_Start(); //产生起始信号
SI2C_Send(SC8905_ADDR|0); //发送SC8905芯片地址及读写位,0表示写
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 1;
}
SI2C_Send(1); //发送数据要写入的地址
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 2;
}
for(i=0; i<8; i++) //依次写入8个字节的数据到寄存器
{
SI2C_Send(SC_Buff[i]);
if(1 == SI2CIsAck()) //检测SC8905是否有响应
{
SI2C_Stop(); //产生停止信号
return 3;
}
}
SI2C_Stop(); //产生停止信号
return 0;
}
开始测试时没有对SC8905评测板供电,读取到前8个寄存器的数值全为0:
为SC8905供电之后(VBUS或者VBAT均可),读取的寄存器数据不为0(见下图),应该是读取到了寄存器的数据:
按理开机直接读取寄存器的数据应该是默认值,但我读取的数据除了01H(CSO_SET寄存器)数据正确外(40=0x0010 1000),其他7个数据全是255(即0x1111 1111),与默认值不一致,也许是我的连续读命令不正确所致。
下面是数据手册中对I2C通讯描述的译文:
SC8905_I2C.docx
(385.54 KB, 下载次数: 64)