【SC8905 EVM测评】+单片机I2C通讯实验
<div class='showpostmsg'><p> 早已准备用沁恒CH579开发板来做SC8905EVM的I2C通讯实验,这样做一个实验可以完成两个评测。但调试CH579的I2C通讯花费了不少时间,昨天才调试成功,于是立马来做SC8905的I2C通讯实验。</p><p> 从使用指南和数据手册中得知SC8905评测板支持100K和400K两种速度的I2C通讯标准,其写地址为<span lang="EN-US" style="font-size:12.0pt"><span style="font-family:"Calibri","sans-serif"">0xC4,</span></span>读地址为<span lang="EN-US" style="font-size:12.0pt"><span style="font-family:"Calibri","sans-serif"">0xC5。</span></span>10个寄存器的地址依次为01H~0AH(如下图):</p>
<p></p>
<p> 本次首先实验读取寄存器的数据,实验的照片如下,通过外接电源给VBUS供电,万用表读取VBAT的电压:</p>
<p></p>
<p> 下面是读写寄存器的代码,读取的数据存放在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<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;
}
</code></pre>
<p> 开始测试时没有对SC8905评测板供电,读取到前8个寄存器的数值全为0:</p>
<p></p>
<p></p>
<p> 为SC8905供电之后(VBUS或者VBAT均可),读取的寄存器数据不为0(见下图),应该是读取到了寄存器的数据:</p>
<p></p>
<p></p>
<p> 按理开机直接读取寄存器的数据应该是默认值,但我读取的数据除了01H(CSO_SET寄存器)数据正确外(40=0x0010 1000),其他7个数据全是255(即0x1111 1111),与默认值不一致,也许是我的连续读命令不正确所致。</p>
<p> 下面是数据手册中对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> <p> 仔细检查了代码,原来误将读循环中的一行DOACK注释了(第44行),所以就不能继续读取数据,将注释去掉之后再测试,就读取到正确的寄存器默认值:</p>
<p></p>
<p>寄存器地址 默认值 读取值(十进制)</p>
<p> 01H 0x0010 1000 40 </p>
<p> 02H 0xxxxx xx00 0</p>
<p> 03H 0x0000 0000 0</p>
<p> 04H 0xxxx0 0000 0</p>
<p> 05H 0x0001 0000 16</p>
<p> 06H 0x0011 0000 48</p>
<p> 07H 0xxxxx xx10 2</p>
<p> 08H 0x0000 0001 1</p>
<p>二者完全一致,证明读取数据完全成功。</p>
<p> 补上屏幕局部的照片,这样看得更清楚:</p>
<p> </p>
<p></p>
<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>
<p>学习了 非常好</p>
<p>大佬,为啥这款芯片的资料在南芯官网搜不到呀</p>
HJ_Guang 发表于 2024-4-5 21:49
大佬,为啥这款芯片的资料在南芯官网搜不到呀
<p>我被您给难倒了!抱歉的很,我无法回答您的问题,因为我与厂家也不熟悉。</p>
<p> 求SC8905 或者SC08906 的芯片 I2C 设置工具,一台无人机电池管理芯片是SC8906 电池饿死被锁,没找到任何的解锁软件,或者南芯电源管理芯片的设置软件及设置说明,这一点Ti做的比较好,提供了专门的芯片管理软件。大疆的绝大多数电池管理芯片都是Ti的能进行解锁或者换电芯DIY,如果哪位大侠有南芯的电池芯片设置工具,希望能分享一下,我邮箱是1205345948@qq.com </p>
页:
[1]