hujj 发表于 2020-9-23 13:06

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

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

<p>&nbsp; &nbsp; 从使用指南和数据手册中得知SC8905评测板支持100K和400K两种速度的I2C通讯标准,其写地址为<span lang="EN-US" style="font-size:12.0pt"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">0xC4,</span></span>读地址为<span lang="EN-US" style="font-size:12.0pt"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">0xC5。</span></span>10个寄存器的地址依次为01H~0AH(如下图):</p>

<p></p>

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

<p></p>

<p>&nbsp; &nbsp; 下面是读写寄存器的代码,读取的数据存放在SC_Buff数组中,本次仅测试读取寄存器,尚未测试写寄存器:</p>

<pre>
<code>
#include "sc8905.h"
#include "i2c.h"


extern uint8_t SC_Buff;

/******************************************************************************************
* 函数名称:        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&lt;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&lt;8; i++)            //依次写入8个字节的数据到寄存器
    {
      SI2C_Send(SC_Buff);
      if(1 == SI2CIsAck())      //检测SC8905是否有响应
      {
            SI2C_Stop();            //产生停止信号
            return 3;
      }
    }

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

</code></pre>

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

<p></p>

<p></p>

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

<p></p>

<p></p>

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

<p>&nbsp; &nbsp; 下面是数据手册中对I2C通讯描述的译文:</p>

<p></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

hujj 发表于 2020-9-23 13:39

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

<p></p>

<p>寄存器地址&nbsp; &nbsp; &nbsp; 默认值&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 读取值(十进制)</p>

<p>&nbsp; &nbsp; 01H&nbsp;&nbsp; &nbsp; &nbsp; 0x0010 1000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 40&nbsp;</p>

<p>&nbsp; &nbsp; 02H&nbsp; &nbsp; &nbsp; &nbsp;0xxxxx&nbsp; xx00&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0</p>

<p>&nbsp; &nbsp; 03H&nbsp; &nbsp; &nbsp; &nbsp;0x0000&nbsp;0000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0</p>

<p>&nbsp; &nbsp; 04H&nbsp; &nbsp; &nbsp; &nbsp;0xxxx0&nbsp;0000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0</p>

<p>&nbsp; &nbsp; 05H&nbsp; &nbsp; &nbsp; &nbsp;0x0001 0000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 16</p>

<p>&nbsp; &nbsp; 06H&nbsp; &nbsp; &nbsp; &nbsp;0x0011 0000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 48</p>

<p>&nbsp; &nbsp; 07H&nbsp; &nbsp; &nbsp; &nbsp;0xxxxx xx10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2</p>

<p>&nbsp; &nbsp; 08H&nbsp; &nbsp; &nbsp; &nbsp;0x0000 0001&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1</p>

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

hujj 发表于 2020-9-23 13:43

<p>&nbsp; &nbsp; 补上屏幕局部的照片,这样看得更清楚:</p>

<p>&nbsp;</p>

<p></p>

okhxyyo 发表于 2020-9-27 09:53

<p><a href="https://bbs.eeworld.com.cn/thread-1140004-1-1.html" target="_blank">南芯SC8905 EVM测评</a></p>

<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1140004-1-1.html">https://bbs.eeworld.com.cn/thread-1140004-1-1.html</a></p>

kimirak 发表于 2022-3-1 10:33

<p>学习了 非常好</p>

HJ_Guang 发表于 2024-4-5 21:49

<p>大佬,为啥这款芯片的资料在南芯官网搜不到呀</p>

hujj 发表于 2024-4-6 17:06

HJ_Guang 发表于 2024-4-5 21:49
大佬,为啥这款芯片的资料在南芯官网搜不到呀

<p>我被您给难倒了!抱歉的很,我无法回答您的问题,因为我与厂家也不熟悉。</p>

飞翔3000 发表于 2024-9-26 22:57

<p>&nbsp; &nbsp; &nbsp;求SC8905 或者SC08906 的芯片 I2C 设置工具,一台无人机电池管理芯片是SC8906 电池饿死被锁,没找到任何的解锁软件,或者南芯电源管理芯片的设置软件及设置说明,这一点Ti做的比较好,提供了专门的芯片管理软件。大疆的绝大多数电池管理芯片都是Ti的能进行解锁或者换电芯DIY,如果哪位大侠有南芯的电池芯片设置工具,希望能分享一下,我邮箱是1205345948@qq.com </p>
页: [1]
查看完整版本: 【SC8905 EVM测评】+单片机I2C通讯实验