尊敬的 TI 论坛团队:
我正在使用 BQ76942 EVM 板。 实际上、我希望通过 SPI00通道、通过 Renesas RL78/F13 (R5F10BGE) LQFP-48引脚微控制器对 BQ76942器件进行 SPI 通信。
下面 提供了硬件连接详细信息 BQ76942 BMS 如何通过 RL78/F13 (R5F10BGE)微控制器连接 SPI00。
BQ76942引脚--- >> RL78/F13 (R5F10BGE)引脚
(1) SPI_SCLK (26引脚)--> P1.7 (SCK00)
(2) SPI_MISO (27引脚)--- >>P1.6 (SI00)
(3) SPI_MOSI (28引脚)--- >>P1.5 (SO00)
(4) SPI_CS (29引脚)--- >> P3.0 (SSI00)
我的问题要点:-
(1)当我发送以下命令序列来读取电池1电压时、该电压位于 BQ76941 RAM 位置的0x14和0x15。 我没有得到电池1电压读数的值、
我们有一段时间从这两个位置都获得0x00和0xFF。
(2)请查看我的命令序列或我发送的电池1电压读数命令是否正确?
(3)如果上述命令及其顺序 不正确、请告诉我正确的命令及其顺序。
我们在源代码中实现的命令及其序列:-
(1)---- 器件复位命令= 0x0012 DEVICE_RESET_TxArr_L[0]=0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE DEVICE_RESET_TxArr_L[1]=0x12;//--lower byte =0x12 DEVICE_RESET_TxArr_H[0]=0xBF;//-(R/W 位=1表示写入)+0x3F=0xBF DEVICE_RESET_TxArr_H[1]=0x00;//-较高字节=0x00 //--------------- (2)--swap 到 SPI 命令=0x7C35---- SWAP_SPI_TxArr_L[0]=0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE SWAP_SPI_TxArr_L[1]=0x35;//低位字节=0x35 SWAP_SPI_TxArr_H[0]=0xBF;//-(R/W 位=1表示写入)+0x3F=0xBF Swap_SPI_TxArr_H[1]=0x7C;//High Byte =0x7C //--- (3)--REG0配置使能:地址= 0x921B,数据= 0x01 (REG0_EN 位= 1) //--addres 写入(0x921B) REG0_TxCmdAdd_L[0]=0xBE;//--(R/W 位=1表示写入)+0x3E=0xBE REG0_TxCmdAdd_L[1]=0x1B;//低位字节=0x1B REG0_TxCmdAdd_H[0]= 0xBF;//-(R/W 位= 1表示写入)+0x3F = 0xBF REG0_TxCmdAdd_H[1]=0x92;//高位字节=0x92 //-数据地址写入0x40=0x01 REG0_TxDataAdd[0]= 0xC0;//-(R/W 位=1表示写入)+0x40=0xC0 (写入值@ 0x40) //--值写入 REG0_TxValue[0]=0x01;//数据=0x01 (REG0_EN 位=1) //--------------- (4)--REG1=3.3V 使能:地址=0x921A,数据=0x0D (3.3V)[REG1V_2=1,REG1V_1=1,REG1V_0=0,REG0_EN 位=1] //--addres 写入(0x921A) REG1_TxCmdAdd_L[0]= 0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE REG1_TxCmdAdd_L[1]=0x1A;//lower byte=0x1A REG1_TxCmdAdd_H[0]= 0xBF;//-(R/W 位= 1表示写入)+0x3F = 0xBF REG1_TxCmdAdd_H[1]=0x92;//高位字节=0x92 //-数据地址写入0x40=0x0D REG1_TxDataAdd[0]= 0xC0;//-(R/W 位=1表示写入)+0x40=0xC0 (写入值@ 0x40) //--值写入 REG1_TxValue[0]= 0x0D;//-数据= 0x0D (REG1V_2=1、REG1V_1=1、REG1V_0=0、REG0_EN 位=1) ///---------------------------------- (5)--单元格1单字节读数-- CELL1_VL_Lbyte_Txarr[0]= 0x14;//0x14位置读取 CELL1_Vol_Lbyte_Txarr[1]=0xFF; (6)--Cell 1单字节读数--- CELL1_Vol_Hbyte_Txarr[0]= 0x15;//0x15位置读取 CELL1_Vol_Hbyte_Txarr[1]=0xFF;
///----------------------------------
用于读取 Cell 1电压的代码中的函数和变量:-
//--functions & Variable Declaration (函数和变量声明)----
uint8_t cell1_Vol_Lbyte_Txarr[3]、cell1_Vol_Lbyte_Rxarr[3];
uint8_t cell1_Vol_Hbyte_Txarr[3]、cell1_Vol_Hbyte_Rxarr[3];
位 Flag_Device_Reset、
Flag_Swap_TO_SPI、
FLAG_REG0_Config_Enable、
FLAG_REG1_Config_Enable;
uint8_t swap_SPI_TxArr_L[2]、swap_SPI_TxArr_H[2]、swap_SPI_RxArr_L[2]、swap_SPI_RxArr_H[2];
uint8_t Device_Reset_TxArr_L[2]、
DEVICE_RESET_TxArr_H[2]、
DEVICE_RESET_RxArr_L[2]、
DEVICE_RESET_RxArr_H[2];
uint8_t REG0_TxCmdAdd_L[2]、REG0_RxCmdAdd_L[2]、
REG0_TxCmdAdd_H[2]、REG0_RxCmdAdd_H[2]、
REG0_TxDataAdd[1]、REG0_RxDataAdd[1]、
REG0_TxValue[1]、REG0_RxValue[1];
uint8_t REG1_TxCmdAdd_L[2]、REG1_RxCmdAdd_L[2]、
REG1_TxCmdAdd_H[2]、REG1_RxCmdAdd_H[2]、
REG1_TxDataAdd[1]、REG1_RxDataAdd[1]、
REG1_TxValue[1]、REG1_RxValue[1];
uint8_t Cell_1_Vol_单字 节= 0、Cell_1_Vol_单字 节= 0;
void ucSPI00_read_Cell_1_单字 节电压(void);
void ucSPI00_read_Cell_1_Hbyte_Voltage (void);
void swap_TO_SPI_Communication_Init (void);
void BQ76942_Device_Reset (void);
void REG0_Config_Enable (void);
void REG1_Config_Enable (void);
//---calling of main function-----------------
void main (void)
{
PIOR4 = 0x00U;
SELLOSC = 1U;
MDIV = 0x00;
SELPLL = 0U;
CMC = 0x00;振荡器的//X1和 X2引脚作为输入;端口引脚。
CKC = 0x00;//选择内部高速振荡器。
CSC = 0xC0;//外部振荡器 X1-X2和 XT1-XT2停止、内部高速振荡器运行。
HOCODIV = 0x00;//无频分频---总线时钟= 24MHz
CRC0CTL = 0x00;
IAWCTL=0x00;
vMain_PowerOnInit();
EI();
///----------------------------------
//--Date 03-12-2020 @ 016:51 PM 经精细测试正常。
//重置设备
defBQ76942_Rst_shut_set;//P13.0正常工作
vMain_uSDelay (1000);vMain_uSDelay (1000);
defBQ76942_Rst_shut_reset;
//---- 器件复位命令= 0x0012
DEVICE_RESET_TxArr_L[0]=0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE
DEVICE_RESET_TxArr_L[1]=0x12;//--lower byte =0x12
DEVICE_RESET_TxArr_H[0]=0xBF;//-(R/W 位=1表示写入)+0x3F=0xBF
DEVICE_RESET_TxArr_H[1]=0x00;//-高位字节=0x00
///----------------------------------
//--swap 至 SPI 命令=0x7C35----
SWAP_SPI_TxArr_L[0]=0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE
SWAP_SPI_TxArr_L[1]=0x35;//低位字节=0x35
SWAP_SPI_TxArr_H[0]=0xBF;//-(R/W 位=1表示写入)+0x3F=0xBF
SWAP_SPI_TxArr_H[1]=0x7C;//较高字节=0x7C
///----------------------------------
//--REG0配置使能:地址= 0x921B,数据= 0x01 (REG0_EN 位= 1)
//--addres 写入(0x921B)
REG0_TxCmdAdd_L[0]=0xBE;//--(R/W 位=1表示写入)+0x3E=0xBE
REG0_TxCmdAdd_L[1]=0x1B;//低位字节=0x1B
REG0_TxCmdAdd_H[0]= 0xBF;//-(R/W 位= 1表示写入)+0x3F = 0xBF
REG0_TxCmdAdd_H[1]=0x92;//高位字节=0x92
//-数据地址写入0x40=0x01
REG0_TxDataAdd[0]= 0xC0;//-(R/W 位=1表示写入)+0x40=0xC0 (写入值@ 0x40)
//--值写入
REG0_TxValue[0]= 0x01;//数据= 0x01 (REG0_EN 位= 1)
///----------------------------------
//--REG1=3.3V 使能:地址=0x921A,数据=0x0D (3.3V)[REG1V_2=1,REG1V_1=1,REG1V_0=0,REG0_EN 位=1]
//--addres 写入(0x921A)
REG1_TxCmdAdd_L[0]= 0xBE;//-(R/W 位=1表示写入)+0x3E=0xBE
REG1_TxCmdAdd_L[1]=0x1A;//lower byte=0x1A
REG1_TxCmdAdd_H[0]= 0xBF;//-(R/W 位= 1表示写入)+0x3F = 0xBF
REG1_TxCmdAdd_H[1]=0x92;//高位字节=0x92
//-数据地址写入0x40=0x0D
REG1_TxDataAdd[0]= 0xC0;//-(R/W 位=1表示写入)+0x40=0xC0 (写入值@ 0x40)
//--值写入
REG1_TxValue[0]= 0x0D;//-数据= 0x0D (REG1V_2=1、REG1V_1=1、REG1V_0=0、REG0_EN 位=1)
///----------------------------------
//--电池1单字节读数---
CELL1_VL_Lbyte_Txarr[0]= 0x14;//0x14位置读取
CELL1_Vol_Lbyte_Txarr[1]=0xFF;
//--Cell 1单字节读数---
CELL1_Vol_Hbyte_Txarr[0]= 0x15;//0x15位置读取
CELL1_Vol_Hbyte_Txarr[1]=0xFF;
Flag_Device_Reset=1;
Flag_Swap_TO_SPI=1;
FLAG_REG0_Config_Enable=1;
FLAG_REG1_Config_Enable=1;
while (1)
{//main while start
///------------------ BQ76942设备初始化-------------------------------------------------------
while (Flag_Device_Reset)//--Send Device Reset commmand->0x0012直到返回正确的值
{
BQ76942_Device_Reset ();
if (((Device_Reset_TxArr_L[0]= Device_Reset_RxArr_L[0])&&(Device_Reset_TxArr_H[0]= Device_Reset_RxArr_H[0])//检查器件复位
Flag_Device_Reset=0;
}
while (Flag_Swap_TO_SPI)//-发送 swap 至 SPI 通信命令->0x7C35、直到返回正确的值
{
swap_TO_SPI_Communication_Init();
if ((SWAP_SPI_TxArr_L[0]= SWAP_SPI_RxArr_L[0])&&(SWAP_SPI_TxArr_H[0]= SWAP_SPI_RxArr_H[0])//检查器件跳转到 SPI
Flag_Swap_TO_SPI=0;
}
while (Flag_REG0_Config_Enable)//Send REG0 Enable 命令--> Value =0x01 (REG0_EN 位=1),位于地址=0x921B 的 REG0配置
{
REG0_Config_Enable ();
if ((REG0_TxCmdAdd_L[0]= REG0_RxCmdAdd_L[0])&&(REG0_TxCmdAdd_H[0]= REG0_RxCmdAdd_H[0])//检查 REG0 Enable 命令
FLAG_REG0_Config_Enable=0;
}
while (Flag_REG1_Config_Enable)//Send REG1=3.3V Enable:Address=0x921A,Data=0x0D (3.3 V)[REG1V_2=1,REG1V_1=1,REG1V_0=0,REG0_EN 位=1]
{
REG1_Config_Enable();
if ((REG1_TxCmdAdd_L[0]= REG1_RxCmdAdd_L[0])&&(REG1_TxCmdAdd_H[0]= REG1_RxCmdAdd_H[0])//检查 REG1 Enable 命令
FLAG_REG1_Config_Enable=0;
}
///------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//---0x14和0x15位置处的电芯1电压读数
while (1)//- Cell 1电压低位字节的连续读数
{
ucSPI00_read_Cell_1_单字 节电压();//读取 Cell_1电压下限字节---Send at MOSI (0x14、0xFF)
if (cell1_Vol_Lbyte_Txarr[0]= cell1_Vol_Lbyte_Rxarr[0])//电压读取(MOSI=0x14且 MISO = 0x14)
{
CELL_1_Vol_Lbyte=CELL1_Vol_Lbyte_Rxarr[1];
中断;
}
}
while (1)//- Cell 1电压高位字节的连续读数
{
ucSPI00_read_Cell_1_Hbyte_Voltage ();//读取较高字节的 Cell _1电压
if (cell1_Vol_Hbyte_Txarr[0]= cell1_Vol_Hbyte_Rxarr[0])//电压读取(MOSI=0x15且 MISO =0x15)
{
CELL_1_Vol_Hbyte=CELL1_Vol_Hbyte_Rxarr[1];
中断;
}
}
///----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
}//main 在结束时
}
///-------- 函数定义-------------------------------------------------------
void REG1_Config_Enable (void)(空)
{
//--Enable REG1 Config:在 REG1 config Address=0x921A 时写入值=0x0D (REG1V_2=1、REG1V_1=1、REG1V_0=0、REG0_EN 位=1)
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxCmdAdd_L[0]、1、(uint8_t*)®1_RxCmdAdd_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxCmdAdd_L[1]、1、(uint8_t*)®1_RxCmdAdd_L[1]);//Write REG0 LByte Addr=0x1A
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxCmdAdd_H[0]、1、(uint8_t*)®1_RxCmdAdd_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxCmdAdd_H[1]、1、(uint8_t*)®1_RxCmdAdd_H[1]);//Write REG0 HByte Addr=0x92
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxDataAdd[0]、1、(uint8_t*)®1_RxDataAdd[0]);//写入数据 Addr=0xC0 (W=1+0x40、写入值@ 0x40)
ucSPI00_ReadWriteData (1、(uint8_t*)®1_TxValue[0]、1、(uint8_t*)®1_RxValue[0]);//Write Value=0x0D (REG1V_2=1、REG1V_1=1、REG1V_1=1、REG1EN_0 = 0x0、REG0 = 1、REG0 = 0xC0位)
}
空 REG0_Config_Enable (空)
{
//--Enable REG0 Config:在 REG0配置地址=0x921B 处写入值=0x01 (REG0_EN 位=1)
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxCmdAdd_L[0]、1、(uint8_t*)®0_RxCmdAdd_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxCmdAdd_L[1]、1、(uint8_t*)®0_RxCmdAdd_L[1]);//Write REG0 LByte Addr=0x1B
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxCmdAdd_H[0]、1、(uint8_t*)®0_RxCmdAdd_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxCmdAdd_H[1]、1、(uint8_t*)®0_RxCmdAdd_H[1]);//Write REG0 HBAddr=0x92
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxDataAdd[0]、1、(uint8_t*)®0_RxDataAdd[0]);//写入数据 Addr=0xC0 (W=1+0x40、写入值@ 0x40)
ucSPI00_ReadWriteData (1、(uint8_t*)®0_TxValue[0]、1、(uint8_t*)®0_RxValue[0]);//写入值=0x01 (REG0_EN 位=1)(位于0xC0
}
void BQ76942_Device_Reset (void)
{//---- 设备重置命令0x0012
ucSPI00_ReadWriteData (1、(uint8_t*)&Device_Reset_TxArr_L[0]、1、(uint8_t*)&Device_Reset_RxArr_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&Device_Reset_TxArr_L[1]、1、(uint8_t*)&Device_Reset_RxArr_L[1]);//Write 命令 Addr=0x12
ucSPI00_ReadWriteData (1、(uint8_t*)&Device_Reset_TxArr_H[0]、1、(uint8_t*)&Device_Reset_RxArr_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&Device_Reset_TxArr_H[1]、1、(uint8_t*)&Device_Reset_RxArr_H[1]);//Write 命令 Addr=0x00
}
void swap_TO_SPI_Communication_Init (void)
{//----swap 至 SPI 命令=0x7C35
ucSPI00_ReadWriteData (1、(uint8_t*)&swap_SPI_TxArr_L[0]、1、(uint8_t*)&swap_SPI_RxArr_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&swap_SPI_TxArr_L[1]、1、(uint8_t*)&swap_SPI_RxArr_L[1]);//Write 命令 Addr=0x35
ucSPI00_ReadWriteData (1、(uint8_t*)&swap_SPI_TxArr_H[0]、1、(uint8_t*)&swap_SPI_RxArr_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&swap_SPI_TxArr_H[1]、1、(uint8_t*)&swap_SPI_RxArr_H[1]);//Write 命令 Addr=0x7C
}
void ucSPI00_read_Cell_1_单字 节电压(void)
{
ucSPI00_ReadWriteData (1、(uint8_t*)&cell1_VOL_Lbyte_Txarr[0]、1、(uint8_t*)&cell1_VOL_Lbyte_Rxarr[0]);//写入命令 Addr=0x14 // Cell volt 1单字节
ucSPI00_ReadWriteData (1、(uint8_t*)&cell1_Vol_Lbyte_Txarr[1]、1、(uint8_t*)&cell1_Vol_Lbyte_Rxarr[1]);//写入命令 Addr=0xFF//虚拟 字节
}
void ucSPI00_read_Cell_1_Hbyte_Voltage (void)
{
//--Cell 1单字节----
CELL1_Vol_Hbyte_Txarr[0]= 0x15;//0x15位置读取
CELL1_Vol_Hbyte_Txarr[1]=0xFF;
ucSPI00_ReadWriteData (1、(uint8_t*)&cell1_VOL_Hbyte_Txarr[0]、1、(uint8_t*)&cell1_VOL_Hbyte_Rxarr[0]);//写入命令 Addr=0x15//Cell volt 1 Hbyte
ucSPI00_ReadWriteData (1、(uint8_t*)&cell1_Vol_Hbyte_Txarr[1]、1、(uint8_t*)&cell1_Vol_Hbyte_Rxarr[1]);//写入命令 Addr=0xFF//虚拟 字节
}
/
名称:ucSPI00_ReadWriteData
参数:pTxBuf:Tx 缓冲区的起始地址
:ucTxByte:要发送的字节数
:pRxBuff:Rx 缓冲器地址
返回:无
说明:通过 SPI 总线 CH0发送和接收数据
(三 /
uint8_t ucSPI00_ReadWriteData (uint8_t ucDevID、uint8_t * pTxBuf、uint8_t ucTxByte、uint8_t * pRxBuf)
{
IF (ucTxByte < 1U)
{
返回0;
}
其他
{
ucSPI_CommDevID = ucDevID;
ucSPI_TxByteCount = ucTxByte;
pSPI_TxADD = pTxBuf;
if (ucSPI_CommDevID=defSPI0_DevID_BMS)
{
pSPI01_RxADD = pRxBuf;
pSPI00_RxAdd = ucSPI_DummyByte;
}
其他
{
if (ucSPI_CommDevID=defSPI0_DevID_Flash)
{
pSPI00_RxADD = pRxBuf;
pSPI01_RxAdd = ucSPI_DummyByte;
}
}
CSIMK00 = 1U;//禁用中断
SDR00L =* pSPI_TxADD;//发送第一个字节
pSPI_TxAdd++;
ucSPI_TxByteCount--;
CSIMK00 = 0U;//启用 INTCSI00中断
}
返回1;
}
/
名称:vSPI_ISR_SPI00
参数:无
返回:无
说明:ISR 在 SPI 总线 CH0上传输数据
(三 /
_interrupt static void vSPI_ISR_SPI00 (void)
{
pSPI00_RxADD = SDR00L;
pSPI00_RxAdd++;
if (ucSPI_TxByteCount!= 0U)
{
SDR00L =* pSPI_TxADD;
pSPI_TxAdd++;
ucSPI_TxByteCount--;
}
其他
{
IF (ucSPI_TxByteCount == 0U)
{
bSPI_TxStatusFlag =高电平;
}
}
}