微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI电源管理交流 > 求帮忙看看程序MCU通过SMBUS读取BQ40Z60的DF数据

求帮忙看看程序MCU通过SMBUS读取BQ40Z60的DF数据

时间:10-02 整理:3721RD 点击:

给BQ40Z60上电(VCC=25V,ACP=25V),然后用MCU通过模拟SMBUS读取DF数据。

unsigned int DF[2]={0x00,0x40};//BQ40Z60DF读取那要求先发送低位再发送高位

unsigned int Read_Data[32];//存储读取到的数据

void SMBUS_Send_Byte(uint8_t txd)
{
uint8_t t;
SMBD_OUT();
SMBC_0();//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
//SMBUS_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7)
SMBD_1();
else
SMBD_0();
txd<<=1;
delay_us(2); 
SMBC_1();
delay_us(6);
SMBC_0();
delay_us(6);
}
}

uint16_t SMBUS_Read_Byte(unsigned char ack)
{
uint16_t i,receive=0;
SMBD_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
SMBC_0();
delay_us(6);
SMBC_1();
receive<<=1;
if(READ_SDA)receive++;
delay_us(6);
}
if (!ack)
SMBUS_NAck();//发送nACK
else
SMBUS_Ack(); //发送ACK
return receive;
}

uint8_t SMBUS_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SMBD_IN(); //SDA设置为输入
SMBD_1();delay_us(1);
SMBC_1();delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
SMbus_Stop();
return 1;
}
}
SMBC_0();//时钟输出0
return 0;
}

/*Address:从器件地址,command:指令,RData:读取数据存储的数组,TData:发送数据块,N:需要发送的块的数量*/

void Block_Read(uint8_t Address,uint8_t Command,uint8_t RData[32],uint8_t TData[32],uint8_t N)
{
uint8_t i;
SMbus_Start();//开始
SMBUS_Send_Byte(Address&0xFE);
while(SMBUS_Wait_Ack());
SMBUS_Send_Byte(Command);
while(SMBUS_Wait_Ack());
SMBUS_Send_Byte(N);
for(i=0;i<N;i++)
{
SMBUS_Send_Byte(TData[i]);
while(SMBUS_Wait_Ack());
}

SMbus_Start();//开始
SMBUS_Send_Byte(Address|0x01);
while(SMBUS_Wait_Ack());
Byet_Count=SMBUS_Read_Byte(0);
for(i=0;i<Byet_Count;i++)
{
RData[i]=SMBUS_Read_Byte(0);
}
SMbus_Stop();//停止
}

void main()

{

  Block_Read(0x14,0x44,Read_Data,DF,2);

}

运行之后一直卡在等待ACK应答处。从器件地址根据SMBUS1998年版参考手册上的,Smart Battery Selector/Smart Battery System Manager=0x14和40Z60参考手册上的smart-charger device address(0x12),host address(0x14)。两个地址都试过都是卡在wait ACK处。求看看是程序不对还是地址没找对。

 

确保芯片处于Full Access状态


读取SMBus通讯格式(下划线为host侧发送的数据,黄色为bq78350返回的数据)

  1. 发送数据帧格式:Start + Device Address :0x16 + ManufactoryBlockAccess : 0x44 + Data Length: 0x02 + DataFlash Address:0x00 , 0x40 + Checksum: 0xAB + End
  2. 发送数据帧格式:Start + Device Address: 0x16 + ManufactoryBlockAccess:0x44 + Re-Start + Device Address:0x17 + Data Length:0x22(DataFlash Address 2bytes+32bytes data) + 34bytes Data + Checksum:0x85 + End
  3. 如果需要读取后续的dataflash的内容,重复发送第2步的内容.

 

以下为示例读取0x4000后的64bytes:

S  Addr:0x16   0x44   0x02   0x00   0x40   0xAB   P

S  Addr:0x16   0x44   S  Addr:0x17   0x22   0x00   0x40   0x84   0x07   0x02   0x75   0x96   0x19   0x9C   0x65   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x00   0x40   0x00   0x00   0x00   0x00   0x85   P

S  Addr:0x16   0x44   S  Addr:0x17   0x22   0x20   0x40   0x00   0x13   0x88   0x00   0x00   0x13   0x88   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0xFF   0x80   P

 

 

写SMBus通讯格式:

  1. 发送数据帧格式:Start + Device Address: 0x16 + ManufactoryBlockAccess:0x44 + Data Length:0x22(DataFlash Address 2bytes+32bytes data) + DataFlash Address 2bytes + 32bytes Data + Checksum:0x68 + End
  2. 按照读取的方法将更改的数据读取确认修改完成

 

以下为示例: 修改dataflash 地址0x446A: 由0x13 修改为0x1F

S  Addr:0x16   0x44   0x22   0x60   0x44   0x00   0x0A   0x00   0x81   0x00   0x31   0x09   0x00   0x11   0x00   0x1F   0x18   0x43   0x00   0x00   0x50   0xAC   0x97   0x19   0x64   0x10   0xFE   0x06   0xD6   0xFA   0x00   0x64   0x00   0x32   0x00   0x0A   0x01   0x68   P

S  Addr:0x16   0x44   0x02   0x60   0x44   0x42   P

S  Addr:0x16   0x44   S  Addr:0x17   0x22   0x60   0x44   0x00   0x0A   0x00   0x81   0x00   0x31   0x09   0x00   0x11   0x00   0x1F   0x18   0x43   0x00   0x00   0x50   0xAC   0x97   0x19   0x64   0x10   0xFE   0x06   0xD6   0xFA   0x00   0x64   0x00   0x32   0x00   0x0A   0x01   0x26   P

 

怎样判断芯片处于Full Access状态?

SEC[1:0]     MODE
2'b00          Reserved
2'b01          Unsealed
2'b10          Full Access
2'b11          Sealed

详细的参考TRM  11.1.40.2 OperationStatus() Low Word

查看 Operation status SEC1.0 状态

读取operation status是不是按照smbus总线协议上的read block格式发送?

Start+salve address+write+ ManufactoryBlockAccess+Data Length+34bytes Data+Start+salve address+Read+Data Length+34bytes Data?

还是参考手册上的

Example: Read Chemical ID() (0x0006) via AlternateManufacturerAccess()
1. Send Chemical ID() to AlternateManufacturerAccess().
(a) SMBus block write. Command = 0x44. Data sent = 06 00 (data must be sent in little endian)
2. Read the result from AlternateManufacturerAccess().
(a) SMBus block read. Command = 0x44. Data read = 06 00 00 01 (each data entity is returned in little
endian).

发送两次command 0x44?

按照手册上的,

Dataflash的读取按照我的回复,

Operation station,是SBS command,直接读取对应的地址即可。

通过上面的DF的发送格式测试芯片对 ManufactoryBlockAccess : 0x44这个无发产生ack应答,随后跟着的 Data Length: 0x02+ DataFlash Address:0x00 , 0x40高位应答时有时无,DataFlash Address低位无应答,Checksum: 0xAB无应答。地址读写位0x16,0x17应答正常。这是什么情况呢?

 能给个SBS COMMAND的读取的smbus的发送格式吗?

读取SBS command 有两种,直接读取register 地址的;例如下面:

S  Addr:0x16   0x08   S  Addr:0x17   0xBF   0x0B   0xC0   P 

另外一种是需要发送subcommand 到manufacturor command ,然后到对应的返回地址读取数据。

这个是另一个芯片的subcommand的格式,只是参照格式,但是寄存器地址请按照bq40z60的TRM文件确定

S Addr:0x16 0x00 0x07 0x00 0x78 P
S Addr:0x16 0x00 S Addr:0x17 0x00 0x00 0xCD P

好的,谢谢。还有个问题就是用MCU发送地址0x16和0x17能接收到40Z60的的ACK。紧跟着发送manufacturor command:0x00有一定几率是NACK。后续的subcommand 也有一定的几率是NACK。这是什么情况呢?

如果有波形可以看一下是不是波形上的问题,

波形看了,正常。就是无应答。我用的3.3VMCU,模拟SMbus

你好,我是在用78350-R1,关于Data Flash的读取目前已知没调试成功。看到这篇帖子有点启发,想再次咨询下针对BQ78350的Data Flash操作流程。谢谢~

现在我已经能读取DF 和通过命令控制40Z60了。BQ用的SMBUS协议有地方需要延时,具体的拿逻辑分析仪看

你好,“黄色为bq78350返回的数据”,但是帖子里面没有看到背景为黄色的数据。麻烦再标注一下,谢谢~

没有下划线的就是78350返回的数据

上图中红框部分的0x22放在写入0x17之后写入,应该是有问题的,因为在写入0x17之后,BQ78350已经进入读模式,这个时候再写入0x22,会出现无应答的情况。关于data flash数据的读取,希望TI的工程师再指导一下。谢谢~

他这里应该是错了吧~详细的发送格式你可以去看看SMBUS2.0协议

Smbus2.0协议里面关于BlockRead的读取有两种,分别如下:

对DataFlash的读取,是应该按照上面哪个协议来呢?

上一篇:BQ25895问题
下一篇:Bq40z50发送指令问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top