687|3

871

帖子

3

资源

纯净的硅(初级)

【SC8905 EVM测评】+单片机I2C通讯实验

    早已准备用沁恒CH579开发板来做SC8905EVM的I2C通讯实验,这样做一个实验可以完成两个评测。但调试CH579的I2C通讯花费了不少时间,昨天才调试成功,于是立马来做SC8905的I2C通讯实验。

    从使用指南和数据手册中得知SC8905评测板支持100K和400K两种速度的I2C通讯标准,其写地址为0xC4,读地址为0xC5。10个寄存器的地址依次为01H~0AH(如下图):

MCU_04.jpg

    本次首先实验读取寄存器的数据,实验的照片如下,通过外接电源给VBUS供电,万用表读取VBAT的电压:

MCU_00.jpg

    下面是读写寄存器的代码,读取的数据存放在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 = 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);
        if(1 == SI2CIsAck())        //检测SC8905是否有响应
        {
            SI2C_Stop();            //产生停止信号
            return 3;
        }
    }

    SI2C_Stop();                    //产生停止信号
    return 0;
}

    开始测试时没有对SC8905评测板供电,读取到前8个寄存器的数值全为0:

MCU_02.jpg

MCU_05.jpg

    为SC8905供电之后(VBUS或者VBAT均可),读取的寄存器数据不为0(见下图),应该是读取到了寄存器的数据:

MCU_03.jpg

MCU_06.jpg

    按理开机直接读取寄存器的数据应该是默认值,但我读取的数据除了01H(CSO_SET寄存器)数据正确外(40=0x0010 1000),其他7个数据全是255(即0x1111 1111),与默认值不一致,也许是我的连续读命令不正确所致。

    下面是数据手册中对I2C通讯描述的译文:

SC8905_I2C.docx (385.54 KB, 下载次数: 2)

MCU_01.jpg

回复

871

帖子

3

资源

纯净的硅(初级)

    仔细检查了代码,原来误将读循环中的一行DOACK注释了(第44行),所以就不能继续读取数据,将注释去掉之后再测试,就读取到正确的寄存器默认值:

MCU_07.jpg

寄存器地址      默认值          读取值(十进制)

    01H       0x0010 1000              40 

    02H       0xxxxx  xx00                0

    03H       0x0000 0000                0

    04H       0xxxx0 0000                0

    05H       0x0001 0000              16

    06H       0x0011 0000              48

    07H       0xxxxx xx10                2

    08H       0x0000 0001               1

二者完全一致,证明读取数据完全成功。


回复

871

帖子

3

资源

纯净的硅(初级)

    补上屏幕局部的照片,这样看得更清楚:

 

MCU_08.jpg


回复

1万

帖子

133

资源

管理员

个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复
您需要登录后才可以回帖 登录 | 注册

关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表