求帮忙看看程序MCU通过SMBUS读取BQ40Z60的DF数据
给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返回的数据)
- 发送数据帧格式:Start + Device Address :0x16 + ManufactoryBlockAccess : 0x44 + Data Length: 0x02 + DataFlash Address:0x00 , 0x40 + Checksum: 0xAB + End
- 发送数据帧格式:Start + Device Address: 0x16 + ManufactoryBlockAccess:0x44 + Re-Start + Device Address:0x17 + Data Length:0x22(DataFlash Address 2bytes+32bytes data) + 34bytes Data + Checksum:0x85 + End
- 如果需要读取后续的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通讯格式:
- 发送数据帧格式:Start + Device Address: 0x16 + ManufactoryBlockAccess:0x44 + Data Length:0x22(DataFlash Address 2bytes+32bytes data) + DataFlash Address 2bytes + 32bytes Data + Checksum:0x68 + End
- 按照读取的方法将更改的数据读取确认修改完成
以下为示例: 修改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的读取,是应该按照上面哪个协议来呢?