This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76942:RL78/F13 (R5F10BGE)微控制器的 SPI 接口问题

Guru**** 2558250 points
Other Parts Discussed in Thread: BQ76942

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/961761/bq76942-spi-interface-problem-with-rl78-f13-r5f10bge-microcontroller

器件型号:BQ76942

尊敬的 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; 

///----------------------------------

e2e.ti.com/.../4645.Main.c

用于读取 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*)&REG1_TxCmdAdd_L[0]、1、(uint8_t*)&REG1_RxCmdAdd_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG1_TxCmdAdd_L[1]、1、(uint8_t*)&REG1_RxCmdAdd_L[1]);//Write REG0 LByte Addr=0x1A

ucSPI00_ReadWriteData (1、(uint8_t*)&REG1_TxCmdAdd_H[0]、1、(uint8_t*)&REG1_RxCmdAdd_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG1_TxCmdAdd_H[1]、1、(uint8_t*)&REG1_RxCmdAdd_H[1]);//Write REG0 HByte Addr=0x92

ucSPI00_ReadWriteData (1、(uint8_t*)&REG1_TxDataAdd[0]、1、(uint8_t*)&REG1_RxDataAdd[0]);//写入数据 Addr=0xC0 (W=1+0x40、写入值@ 0x40)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG1_TxValue[0]、1、(uint8_t*)&REG1_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*)&REG0_TxCmdAdd_L[0]、1、(uint8_t*)&REG0_RxCmdAdd_L[0]);//写入命令 Addr=0xBE (W=1+0x3E、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG0_TxCmdAdd_L[1]、1、(uint8_t*)&REG0_RxCmdAdd_L[1]);//Write REG0 LByte Addr=0x1B

ucSPI00_ReadWriteData (1、(uint8_t*)&REG0_TxCmdAdd_H[0]、1、(uint8_t*)&REG0_RxCmdAdd_H[0]);//写入命令 Addr=0xBF (W=1+0x3F、写入过程)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG0_TxCmdAdd_H[1]、1、(uint8_t*)&REG0_RxCmdAdd_H[1]);//Write REG0 HBAddr=0x92

ucSPI00_ReadWriteData (1、(uint8_t*)&REG0_TxDataAdd[0]、1、(uint8_t*)&REG0_RxDataAdd[0]);//写入数据 Addr=0xC0 (W=1+0x40、写入值@ 0x40)
ucSPI00_ReadWriteData (1、(uint8_t*)&REG0_TxValue[0]、1、(uint8_t*)&REG0_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 =高电平;


e2e.ti.com/.../8004.SPI.c