forked from gary/BCU
2
0
Fork 0
BCU/library/bsp/bsp_bf8915a.c

2173 lines
111 KiB
C
Raw Normal View History

2025-02-06 15:08:48 +08:00
/**
******************************************************************************
* @file BF8915A.c
* @version V1.1.4
* @date 2021-12-20
* @brief This file provides the BF8915A functions(<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD>).
*/
#include "bsp_bf8915a.h"
Reg_TypeDef configAArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹA<E1B9B9><41><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t write_buffer[TOTAL_IC * 0x6U];//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
Reg_TypeDef configBArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹB<E1B9B9><42><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Reg_TypeDef configCArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹC<E1B9B9><43><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Reg_TypeDef configDArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹC<E1B9B9><43><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///*!
// \brief SPI1_ReadWriteByte(SPI1<49><31>дһ<D0B4><D2BB><EFBFBD>ֽ<EFBFBD>)
// \param[in] SPI_TxData :SPI<50><49>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// \retval SPI_ReceiveData:SPI<50><49><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//*/
//uint8_t SPI1_ReadWriteByte(uint8_t TxData) //TxData <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><38><CEBB>16λ<36>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI֮ǰ<D6AE><C7B0>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʽ
//{
// u8 retry = 0;
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>SPI<50><49>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4BBBA><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD>־ //0:<3A><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>ǿ<EFBFBD> <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// {
// retry++;
// if(retry>200)return 0;
// }
// SPI_I2S_SendData(SPI1, TxData);//ͨ<><CDA8>SPI1<49><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
// retry=0;
// while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>SPI<50><49>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ǿձ<C7BF>־λ
// {
// retry++;
// if(retry>200)return 0;
// }
// return SPI_I2S_ReceiveData(SPI1); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݣ<EFBFBD>SPI_DR<44>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//}
///*!
// \brief //SPI2<49><32>д<EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD>ΪSTM32<33><32>SPI<50><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MCU<43><55><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// \param[in] SPI_TxData :SPI2<49><32>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// \retval SPI_ReceiveData:SPI2<49><32><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//*/
//uint8_t SPI2_ReadWriteByte(uint8_t TxData)
//{
// u8 retry=0;
// while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>SPI<50><49>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>ձ<EFBFBD>־λ
// {
// retry++;
// if(retry>200)return 0;
// }
// SPI_I2S_SendData(SPI2, TxData);//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPIx<49><78><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// retry=0;
// while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>SPI<50><49>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD>ǿձ<C7BF>־λ
// {
// retry++;
// if(retry>200)return 0;
// }
// return SPI_I2S_ReceiveData(SPI2);//<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>SPIx<49><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
//}
BOOLEAN isospi_reverse = FALSE;//<2F>ı<EFBFBD><C4B1>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>־ջ<D6BE><D5BB><EFBFBD>SPI<50><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>š<EFBFBD>
//FALSE:<3A><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>SDK<44>е<EFBFBD>SPI1Ϊ<31><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ţ<EFBFBD>SPI1<49>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵĵ<D3B5>һ<EFBFBD><D2BB>IC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC0;
//TURE: <20><><EFBFBD>Եķ<D4B5><C4B7><EFBFBD>ͨ<EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>SDK<44>е<EFBFBD>SPI2Ϊ<32><CEAA><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͨ<EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>Ҳ<EFBFBD><D2B2>SPI1<49>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵĵ<D3B5>һ<EFBFBD><D2BB>IC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC0<43><30>
const uint16_t crc15Table[256] = {0x0000, 0xc599, 0xceab, 0x0b32, 0xd8cf, 0x1d56, 0x1664, 0xd3fd, 0xf407, 0x319e, 0x3aac, 0xff35, 0x2cc8, 0xe951, 0xe263, 0x27fa,
0xad97, 0x680e, 0x633c, 0xa6a5, 0x7558, 0xb0c1, 0xbbf3, 0x7e6a, 0x5990, 0x9c09, 0x973b, 0x52a2, 0x815f, 0x44c6, 0x4ff4, 0x8a6d,
0x5b2e, 0x9eb7, 0x9585, 0x501c, 0x83e1, 0x4678, 0x4d4a, 0x88d3, 0xaf29, 0x6ab0, 0x6182, 0xa41b, 0x77e6, 0xb27f, 0xb94d, 0x7cd4,
0xf6b9, 0x3320, 0x3812, 0xfd8b, 0x2e76, 0xebef, 0xe0dd, 0x2544, 0x02be, 0xc727, 0xcc15, 0x098c, 0xda71, 0x1fe8, 0x14da, 0xd143,
0xf3c5, 0x365c, 0x3d6e, 0xf8f7, 0x2b0a, 0xee93, 0xe5a1, 0x2038, 0x07c2, 0xc25b, 0xc969, 0x0cf0, 0xdf0d, 0x1a94, 0x11a6, 0xd43f,
0x5e52, 0x9bcb, 0x90f9, 0x5560, 0x869d, 0x4304, 0x4836, 0x8daf, 0xaa55, 0x6fcc, 0x64fe, 0xa167, 0x729a, 0xb703, 0xbc31, 0x79a8,
0xa8eb, 0x6d72, 0x6640, 0xa3d9, 0x7024, 0xb5bd, 0xbe8f, 0x7b16, 0x5cec, 0x9975, 0x9247, 0x57de, 0x8423, 0x41ba, 0x4a88, 0x8f11,
0x057c, 0xc0e5, 0xcbd7, 0x0e4e, 0xddb3, 0x182a, 0x1318, 0xd681, 0xf17b, 0x34e2, 0x3fd0, 0xfa49, 0x29b4, 0xec2d, 0xe71f, 0x2286,
0xa213, 0x678a, 0x6cb8, 0xa921, 0x7adc, 0xbf45, 0xb477, 0x71ee, 0x5614, 0x938d, 0x98bf, 0x5d26, 0x8edb, 0x4b42, 0x4070, 0x85e9,
0x0f84, 0xca1d, 0xc12f, 0x04b6, 0xd74b, 0x12d2, 0x19e0, 0xdc79, 0xfb83, 0x3e1a, 0x3528, 0xf0b1, 0x234c, 0xe6d5, 0xede7, 0x287e,
0xf93d, 0x3ca4, 0x3796, 0xf20f, 0x21f2, 0xe46b, 0xef59, 0x2ac0, 0x0d3a, 0xc8a3, 0xc391, 0x0608, 0xd5f5, 0x106c, 0x1b5e, 0xdec7,
0x54aa, 0x9133, 0x9a01, 0x5f98, 0x8c65, 0x49fc, 0x42ce, 0x8757, 0xa0ad, 0x6534, 0x6e06, 0xab9f, 0x7862, 0xbdfb, 0xb6c9, 0x7350,
0x51d6, 0x944f, 0x9f7d, 0x5ae4, 0x8919, 0x4c80, 0x47b2, 0x822b, 0xa5d1, 0x6048, 0x6b7a, 0xaee3, 0x7d1e, 0xb887, 0xb3b5, 0x762c,
0xfc41, 0x39d8, 0x32ea, 0xf773, 0x248e, 0xe117, 0xea25, 0x2fbc, 0x0846, 0xcddf, 0xc6ed, 0x0374, 0xd089, 0x1510, 0x1e22, 0xdbbb,
0x0af8, 0xcf61, 0xc453, 0x01ca, 0xd237, 0x17ae, 0x1c9c, 0xd905, 0xfeff, 0x3b66, 0x3054, 0xf5cd, 0x2630, 0xe3a9, 0xe89b, 0x2d02,
0xa76f, 0x62f6, 0x69c4, 0xac5d, 0x7fa0, 0xba39, 0xb10b, 0x7492, 0x5368, 0x96f1, 0x9dc3, 0x585a, 0x8ba7, 0x4e3e, 0x450c, 0x8095
};//precomputed CRC15 Table(Ԥ<><D4A4><EFBFBD><EFBFBD>15λѭ<CEBB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ֵ<EFBFBD>ı<EFBFBD>)
/*!
\brief Wake isoSPI up from idle state(<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic: number of ICs in the daisy chain(<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void wakeup_idle(uint8_t total_ic)
{
int i =0;
for (i =0; i<total_ic; i++)
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
SPI1_ReadWriteByte(0xff);//Guarantees the isoSPI will be in ready mode(<28><>֤<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>SPI<50><49><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>ģʽ)
cs_high();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
SPI2_ReadWriteByte(0xff);//Guarantees the isoSPI will be in ready mode(<28><>֤<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>SPI<50><49><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD>ģʽ)
cs_high_reverse();//<2F><><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
}
/*!
\brief Generic wakeup command to wake the BF8915A from sleep(<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD>˯<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD>ѵ<EFBFBD>ͨ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic: the number of ic(<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void wakeup_sleep(uint8_t total_ic)
{
int i =0;
for (i =0; i<total_ic; i++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC(8915A)оƬ<D0BE><C6AC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>״̬
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
delay_us(300); // Guarantees the BF8915A will be in standby(<28><>֤BF8915A<35><41><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>״̬),<2C><><EFBFBD>ӳ<EFBFBD>Ӧ<EFBFBD><D3A6>200~300us֮<73><D6AE>
cs_high();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
delay_us(10);
}
else
{
cs_low_reverse();//<2F><><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
delay_us(300); // Guarantees the BF8915A will be in standby(<28><>֤BF8915A<35><41><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>״̬),<2C><><EFBFBD>ӳ<EFBFBD>Ӧ<EFBFBD><D3A6>200~300us֮<73><D6AE>
cs_high_reverse();//<2F><><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
delay_us(10);
}
}
}
/*!
\brief Writes an array of bytes out of the SPI port(<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>SPI<EFBFBD>˿<EFBFBD>)
\param[in] len :Number of bytes to be written on the SPI port(SPI<EFBFBD>˿<EFBFBD><EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] writeData:Array of bytes to be written on the SPI port(Ҫд<EFBFBD><EFBFBD>SPI<EFBFBD>˿ڵ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void spi_write_array(uint8_t len, uint8_t writeData[] )
{
uint8_t i = 0;
for (i = 0; i < len; i++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>writeData[] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһ<D2BB><D2BB><EFBFBD>ͳ<EFBFBD>ȥ
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
SPI1_ReadWriteByte((int8_t)writeData[i]);
}
else
{
SPI2_ReadWriteByte((int8_t)writeData[i]);
}
}
}
/*!
\brief Writes and read a set number of bytes using the SPI port(ʹ<EFBFBD><EFBFBD>SPI<EFBFBD>˿<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>)
\param[in] tx_Data: array of data to be written on SPI port(Ҫд<EFBFBD><EFBFBD>SPI<EFBFBD>˿ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] tx_len : length of the tx_data arr(tx_data<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>)
\param[in] rx_data: Input: array that will store the data read by the SPI port(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>SPI<EFBFBD>˿ڶ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] rx_len : Option: number of bytes to be read from the SPI port(ѡ<EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>SPI<EFBFBD>˿<EFBFBD>Ҫ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void spi_write_read(uint8_t tx_Data[],//array of data to be written on SPI port
uint8_t tx_len, //length of the tx data arr
uint8_t *rx_data,//Input: array that will store the data read by the SPI port
uint8_t rx_len //Option: number of bytes to be read from the SPI port
)
{
uint8_t i = 0;
for (i = 0; i < tx_len; i++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>tx_Data[] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһ<D2BB><D2BB><EFBFBD>ͳ<EFBFBD>ȥ
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
SPI1_ReadWriteByte(tx_Data[i]);
}
else
{
SPI2_ReadWriteByte(tx_Data[i]);
}
}
for (i = 0; i < rx_len; i++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһ<D2BB><D2BB><EFBFBD><EFBFBD>rx_data[] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
rx_data[i] = (uint8_t)SPI1_ReadWriteByte(0x00);
}
else
{
rx_data[i] = (uint8_t)SPI2_ReadWriteByte(0xFF);
}
}
}
/*!
\brief Generic function to write BF8915A commands. Function calculated PEC(The Packet Error Code) for tx_cmd data(<EFBFBD><EFBFBD>дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>??<EFBFBD><EFBFBD>Ϊtx_cmd<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] tx_cmd: 2 Byte array containing the BMS command to be sent(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>BMS(<EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD>ϵͳ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_cmd(uint8_t tx_cmd[2])
{
uint8_t cmd[4];//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[0] = tx_cmd[0];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = tx_cmd[1];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(4,cmd);//<2F><>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(4,cmd);//<2F><>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
/*!
\brief Generic function to write BF8915A commands and write payload data. Function calculated PEC for tx_cmd data(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>Ч<EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tx_cmd<EFBFBD><EFBFBD><EFBFBD>ݵĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic : the number of ic(IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] tx_cmd : 2 Byte array containing the BMS command to be sent(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>BMS(<EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD>ϵͳ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] write_data: Array containing the data to be written to the BMS ICs(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD>BMS(<EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD>ϵͳ)IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_write(uint8_t total_ic ,
uint8_t tx_cmd[2],
uint8_t write_data[]
)
{
const uint8_t BYTES_IN_REG = 6;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
const uint8_t CMD_LEN = 4+(8*total_ic);//4:cmd[0]~cmd[3];(8*total_ic):<3A>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD> + 2<><32>8λPEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t *cmd;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD>cmd<6D><64><EFBFBD><EFBFBD>
uint16_t data_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t cmd_index;//<2F><><EFBFBD><EFBFBD>дָ<D0B4><D6B8><EFBFBD><EFBFBD> <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
uint8_t current_ic = total_ic;// current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t current_byte = 0;//<2F><>ǰ<EFBFBD><C7B0>д<EFBFBD><D0B4><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
cmd = (uint8_t *)malloc(CMD_LEN*sizeof(uint8_t));//<2F><><EFBFBD><EFBFBD>cmd<6D><64><EFBFBD><EFBFBD><E9B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9B3A4>
cmd[0] = tx_cmd[0];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = tx_cmd[1];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
cmd_index = 4;//<2F><>4<EFBFBD><34>ʼд<CABC><D0B4><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
for (current_ic = total_ic; current_ic > 0; current_ic--) // executes for each BF8915A, this loops starts with the last IC on the stack(<28><>ÿ<EFBFBD><C3BF>BF8915Aִ<41>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>Ӷ<EFBFBD>ջ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>8915A<35><41>ʼ)
{ //The first configuration written is received by the last IC in the daisy chain(<28>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>IC(8915A)<29><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
for (current_byte = 0; current_byte < BYTES_IN_REG; current_byte++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһд<D2BB><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]<5D><>
{
cmd[cmd_index] = write_data[((current_ic-1)*BYTES_IN_REG)+current_byte];
cmd_index = cmd_index + 1;
}
data_pec = (uint16_t)pec15_calc(BYTES_IN_REG, &write_data[(current_ic-1)*BYTES_IN_REG]);// calculating the PEC for each configuration register data(<28><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>))
cmd[cmd_index] = (uint8_t)(data_pec >> 8);//<2F><><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[cmd_index + 1] = (uint8_t)data_pec;//<2F><><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
cmd_index = cmd_index + 2;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>IC<49><43>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڵ<D6BD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd_index<65><78>ÿ<EFBFBD>ζ<EFBFBD><CEB6><EFBFBD><EFBFBD><EFBFBD>2
}
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(CMD_LEN, cmd);//<2F><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(CMD_LEN, cmd);//<2F><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
free(cmd);//<2F><><EFBFBD><EFBFBD>cmd<6D><64><EFBFBD><EFBFBD>
}
/*!
\brief Generic function to write BF8915A commands and read data(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>). Function calculated PEC for tx_cmd data(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>))
Issues a command onto the daisy chain and reads back 6*total_ic data in the rx_data array(<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>rx_data<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic : the number of ic(IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] tx_cmd : 2 Byte array containing the BMS command to be sent(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>BMS(<EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><EFBFBD><EFBFBD>ϵͳ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] rx_data : Array that the read back data will be stored(<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error: 0: Data read back has matching PEC;1: Data read back has incorrect PEC(0:<EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1:<EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*/
uint8_t BF8915A_read(uint8_t total_ic ,
uint8_t tx_cmd[2],
uint8_t *rx_data)
{
const uint8_t BYTES_IN_REG = 8;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD> + 2<><32>8λPEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t cmd[4];//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD>cmd<6D><64><EFBFBD><EFBFBD>
uint8_t rxDataTemp[256];//<2F>洢SPI<50>˿ڶ<CBBF>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t data_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t received_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t current_byte = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>
cmd[0] = tx_cmd[0];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = tx_cmd[1];//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd, 4, rxDataTemp, (total_ic*BYTES_IN_REG));//Read the configuration data of all ICs on the daisy chain into rx_data[] array
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ //(<28><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>rx_data[]<5D><><EFBFBD><EFBFBD>)
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd, 4, rxDataTemp, (total_ic*BYTES_IN_REG));//Read the configuration data of all ICs on the daisy chain into rx_data[] array
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ //(<28><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>rx_data[]<5D><><EFBFBD><EFBFBD>)
}
for (current_ic = 0; current_ic < total_ic; current_ic++) //executes for each BF8915A in the daisy chain and packs the data(<28>Ծջ<D4BE><D5BB><EFBFBD><EFBFBD>е<EFBFBD>ÿ<EFBFBD><C3BF>BF8915Aִ<41>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
//into the r_comm array as well as check the received data for any bit errors(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>κ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>)
{
for (current_byte = 0; current_byte < BYTES_IN_REG; current_byte++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29><><EFBFBD><EFBFBD>һһд<D2BB><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rx_data[]<5D><>
{
rx_data[(current_ic*BYTES_IN_REG)+current_byte] = rxDataTemp[(current_ic*BYTES_IN_REG)+current_byte];
}
received_pec = (rx_data[(current_ic*BYTES_IN_REG)+6]<<8) + rx_data[(current_ic*BYTES_IN_REG)+7];//<2F><>rx_data[]<5D>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ߵ͹<DFB5>16λ<36><CEBB><EFBFBD><EFBFBD>received_pec<65><63>
data_pec = pec15_calc(6, &rx_data[current_ic*BYTES_IN_REG]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (received_pec != data_pec)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
pec_error = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ
}
}
return(pec_error);
}
/*!
\brief Calculates and returns the CRC15(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>15λѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>ֵ)
\param[in] len : Number of bytes that will be used to calculate a PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] pecData: Array of data that will be used to calculate a PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval The calculated pec15 as an unsigned int(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>15λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*/
uint16_t pec15_calc(uint8_t len,
uint8_t *pecData
)
{
uint16_t remainder,addr;
uint8_t i = 0;
remainder = 16;//initialize the PEC(<28><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
for (i = 0; i<len; i++) // loops for each byte in data array(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֽڵ<D6BD>ѭ<EFBFBD><D1AD>)
{
addr = ((remainder>>7)^pecData[i])&0xff;//calculate PEC table address(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ַ)
remainder = (remainder<<8)^crc15Table[addr];
}
return(remainder*2);//The CRC15 has a 0 in the LSB so the remainder must be multiplied by 2(15λѭ<CEBB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ЧλΪ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
}
/*!
\brief Helper function to set GPIO bits(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIOλ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg: Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] gpio_pd_en: 0: GPIO pin pull-down enable; 1: GPIO pin pull-down disable (default)(0:GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>1:GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Ĭ<EFBFBD><EFBFBD>))
\retval none
*/
void BF8915A_set_cfga_gpio(uint8_t nIC, Reg_TypeDef *configAReg,uint8_t gpio_pd_en)
{
configAReg[nIC].tx_data[0] = gpio_pd_en;//<2F><><EFBFBD><EFBFBD>CFGAR0,0:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>1:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Helper function to set GPIO IO_MODE(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD>ģʽ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg : Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] gpio_analog_en: 0: analog input;1: Ordinary GPIO(0:ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1:<EFBFBD><EFBFBD>ͨGPIO)
\retval none
*/
void BF8915A_set_cfga_gpio_mode(uint8_t nIC, Reg_TypeDef *configAReg,uint8_t gpio_analog_en)
{
configAReg[nIC].tx_data[1] = gpio_analog_en;//<2F><><EFBFBD><EFBFBD>CFGAR1,0:ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>룻1:<3A><>ͨGPIO
}
void BF8915A_set_cfga_adc_init_mode(uint8_t nIC, Reg_TypeDef *configAReg,bool adc_init_mode)
{
if (adc_init_mode)
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]|(0x01<<4);
else
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]&(~(0x01 <<4));
}
/*!
\brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>0
\retval none
*/
void BF8915A_set_cfga_rsvd(uint8_t nIC, Reg_TypeDef *configAReg,BOOLEAN rsvd2,BOOLEAN rsvd1)
{
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]&(~(0x01<<3));//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]&(~(0x01<<2));//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
}
/*!
\brief Helper function to set osr_sel(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg: Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] osr_sel : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfga_osr_sel(uint8_t nIC, Reg_TypeDef *configAReg,BOOLEAN osr_sel)
{
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]&(~(0x01<<1));//д0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>64<36><34>128<32><38>256<35><36>512(<28><><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>OSRѡ<52><D1A1>)
}
/*!
\brief Helper function to set refon(<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>׼<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD>õĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg: Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] refon : 1: VREF1 remains powered on until WDT overflowsVREF1
0: VREF1 is turned off after ADC conversion
(1:VREF1(<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>ѹ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֱ<EFBFBD><EFBFBD>WDT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0:ADCת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>VREF1<EFBFBD>ر<EFBFBD> (Ĭ<EFBFBD><EFBFBD>))
\retval none
*/
void BF8915A_set_cfga_refon(uint8_t nIC, Reg_TypeDef *configAReg,BOOLEAN refon)
{
if (refon)//<2F><><EFBFBD><EFBFBD>CFGAR2<52>ĵ<EFBFBD>
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]|(0x01);//д1,VREF1(<28><>׼<EFBFBD><D7BC>ѹ)<29><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֱ<EFBFBD><D6B1>WDT<44><54><EFBFBD><EFBFBD>
else
configAReg[nIC].tx_data[2] = configAReg[nIC].tx_data[2]&(~(0x01));//д0,ADCת<43><D7AA><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>VREF1<46>ر<EFBFBD>
}
/*!
\brief Helper Function to set uv value in CFG register(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg: Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] uv : Low 8 bits of undervoltage threshold(<EFBFBD><EFBFBD>8λǷѹ<EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfga_uv(uint8_t nIC, Reg_TypeDef *configAReg,uint16_t uv)
{
configAReg[nIC].tx_data[3] = 0x00FF & uv;//<2F><><EFBFBD><EFBFBD>CFGAR3,Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configAReg[nIC].tx_data[4] = configAReg[nIC].tx_data[4]&0xF0;//<2F><>CFGAR4<52><34><34><CEBB><EFBFBD><EFBFBD>
configAReg[nIC].tx_data[4] = configAReg[nIC].tx_data[4]|((0x0F00 & uv)>>8);//<2F><><EFBFBD><EFBFBD>CFGAR4<52><34><34><CEBB>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
}
/*!
\brief helper function to set OV value in CFG register(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg: Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] ov : Overvoltage threshold lower 4 bits(<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>4λ)
\retval none
*/
void BF8915A_set_cfga_ov(uint8_t nIC, Reg_TypeDef *configAReg,uint16_t ov)
{
configAReg[nIC].tx_data[5] = 0x00FF & (ov>>4);//<2F><><EFBFBD><EFBFBD>CFGAR5,<2C><>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configAReg[nIC].tx_data[4] = configAReg[nIC].tx_data[4]&0x0F;//<2F><>CFGAR4<52><34><34><CEBB><EFBFBD><EFBFBD>
configAReg[nIC].tx_data[4] = configAReg[nIC].tx_data[4]|((0x000F & ov)<<4);//<2F><><EFBFBD><EFBFBD>CFGAR4<52><34><34><CEBB><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGAR4<52><34><34><CEBB><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5>
}
/*!
\brief Helper function to set CFGRA variable(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAReg : Register group A(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] gpio_pd_en : GPIO pin pull-down enable; 1: GPIO pin pull-down disable (default)(0:GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>1:GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Ĭ<EFBFBD><EFBFBD>))
\param[in] gpio_analog_en: 0: analog input 1: Ordinary GPIO(0:ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1:<EFBFBD><EFBFBD>ͨGPIO)
\param[in] rsvd2 : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>0
\param[in] rsvd1 : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>0
\param[in] osr_sel : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] refon : 1: VREF1 remains powered on until WDT overflowsVREF1
0: VREF1 is turned off after ADC conversion
(1:VREF1(<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>ѹ)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֱ<EFBFBD><EFBFBD>WDT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0:ADCת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>VREF1<EFBFBD>ر<EFBFBD> (Ĭ<EFBFBD><EFBFBD>))
\param[in] uv_th : Low 8 bits of undervoltage threshold(<EFBFBD><EFBFBD>8λǷѹ<EFBFBD><EFBFBD>ֵ)
\param[in] ov_th : Overvoltage threshold lower 4 bits(<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>4λ)
\retval none
*/
void BF8915A_set_cfgra(uint8_t nIC,
Reg_TypeDef *configAReg,
uint8_t gpio_pd_en,//д0:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>1:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><><C4AC>)<29><>0 :GPIO<49>ŵ<EFBFBD>ֵ<EFBFBD><D6B5>0 <20><>1:GPIO<49>ŵ<EFBFBD>ֵ<EFBFBD><D6B5>1
uint8_t gpio_analog_en,//GPIO0~7ģʽѡ<CABD><D1A1> 0:ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1:<3A><>ͨGPIO
BOOLEAN adc_inti_mode,
BOOLEAN rsvd2,//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
BOOLEAN rsvd1,//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
BOOLEAN osr_sel,//0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>64<36><34>128<32><38>256<35><36>512(<28><><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>OSRѡ<52><D1A1>)
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>λҪ<CEBB><D2AA>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>OSRһ<52><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOLEAN refon, //VREF1(<28><>׼<EFBFBD><D7BC>ѹ)<29><><EFBFBD><EFBFBD> 1 :VREF1<46><31><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֱ<EFBFBD><D6B1>WDT<44><54><EFBFBD><EFBFBD> 0 :ADCת<43><D7AA><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>VREF1<46>ر<EFBFBD><><C4AC>)
uint16_t uv_th,//Under voltage Comparison Voltage(Ƿѹ<C7B7><D1B9>ֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Under voltage threshold ADC Code(Ƿ<><C7B7>ѹ<EFBFBD><D1B9>ֵģ<D6B5><C4A3>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>): uv_th = 3000 * 65535U / 5000U. LSB = 0.0001 ---(3V)
uint16_t ov_th //Over voltage Comparison Voltage(<28><>ѹ<EFBFBD><D1B9>ֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Over voltage threshold ADC Code(<28><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵģ<D6B5><C4A3>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>): ov_th = 4100 * 65535U / 5000U. LSB = 0.0001 ---(4.1V)
)
{
BF8915A_set_cfga_gpio(nIC, configAReg, gpio_pd_en);//<2F><><EFBFBD><EFBFBD>CFGAR0
BF8915A_set_cfga_gpio_mode(nIC, configAReg,gpio_analog_en);//<2F><><EFBFBD><EFBFBD>CFGAR1
BF8915A_set_cfga_adc_init_mode(nIC, configAReg,adc_inti_mode);
BF8915A_set_cfga_rsvd(nIC, configAReg,rsvd2,rsvd1);//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
BF8915A_set_cfga_osr_sel(nIC, configAReg,osr_sel);//<2F><><EFBFBD><EFBFBD>CFGAR2<52>ĵ<EFBFBD>
BF8915A_set_cfga_refon(nIC, configAReg,refon);//<2F><><EFBFBD><EFBFBD>CFGAR2<52>ĵ<EFBFBD>
BF8915A_set_cfga_uv(nIC, configAReg,uv_th);//<2F><><EFBFBD><EFBFBD>CFGAR3<52><33>CFGAR4<52><34>
BF8915A_set_cfga_ov(nIC, configAReg,ov_th);//<2F><><EFBFBD><EFBFBD>CFGAR5<52><35>CFGAR4<52><34>
}
/*!
\brief Helper function to control discharge(<EFBFBD><EFBFBD><EFBFBD>Ʒŵ<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg: Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] dcc : 1: Turn on the switch of Cell x(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>ŵ<EFBFBD><EFBFBD>صĿ<EFBFBD><EFBFBD><EFBFBD>)
0: Turn off the switch of Cell x(<EFBFBD>ر<EFBFBD>x<EFBFBD>ŵ<EFBFBD><EFBFBD>صĿ<EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgb_dcc(uint8_t nIC, Reg_TypeDef *configBReg,uint16_t dcc)
{
configBReg[nIC].tx_data[0] = (uint8_t)dcc;//<2F><><EFBFBD><EFBFBD>CFGBR0,<2C>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>x=1~8
configBReg[nIC].tx_data[1] = (uint8_t)(dcc >> 0x8U);//<2F><><EFBFBD><EFBFBD>CFGBR1,<2C>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>x=9~16
}
/*!
\brief Balanced duty cycle selection(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg : Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] bl_duty_sel: Active balancing duty cycle selection(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><EFBFBD>)
\retval none
*/
//bl_duty_sel(4λ): <20><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1>,ռ<>ձ<EFBFBD>=(BL_DUTY_SEL+1)*10%<25><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ10%~100%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><39><CAB1>100%<25><>
void BF8915A_set_cfgb_bl_duty_sel(uint8_t nIC, Reg_TypeDef *configBReg,
uint8_t bl_duty_sel
)
{
configBReg[nIC].tx_data[2] = configBReg[nIC].tx_data[2] & 0x0F;//<2F><>CFGBR2<52>ĸ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configBReg[nIC].tx_data[2] = configBReg[nIC].tx_data[2] | ((0x0F & bl_duty_sel)<<4);//<2F><><EFBFBD><EFBFBD>CFGBR2<52><32>4λ,<2C><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1>
//<2F><><EFBFBD><EFBFBD>CFGBR2<52><32>
}
/*!
\brief Helper function to set dcto(<EFBFBD><EFBFBD><EFBFBD>÷ŵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>õĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg: Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] dcto : Discharge timing overflow value configuration(<EFBFBD>ŵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ϸ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DCTO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ)
\retval none
*/
void BF8915A_set_cfgb_dcto(uint8_t nIC, Reg_TypeDef *configBReg,
uint8_t dcto
)
{
configBReg[nIC].tx_data[2] = configBReg[nIC].tx_data[2] & 0xF0;//<2F><>CFGBR2<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configBReg[nIC].tx_data[2] = configBReg[nIC].tx_data[2] | (0x0F & dcto);//<2F><><EFBFBD><EFBFBD>CFGBR2<52><32>4λ,<2C>ŵ綨ʱ<E7B6A8><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGBR2<52><32>
}
/*!
\brief Helper function to set vuv_bl(<EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><EFBFBD><EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg: Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] vuv_bl : Lower 8 bits of equalization undervoltage threshold(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĵ<EFBFBD>8λ)
\retval none
*/
void BF8915A_set_cfgb_vuv_bl(uint8_t nIC, Reg_TypeDef *configBReg,
uint16_t vuv_bl//<2F><><EFBFBD><EFBFBD>Ƿѹֵ(12λ)
)
{
configBReg[nIC].tx_data[3] = vuv_bl & 0xFF;//<2F><><EFBFBD><EFBFBD>CFGBR3,<2C><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configBReg[nIC].tx_data[4] = configBReg[nIC].tx_data[4] & 0xF0;//<2F><>CFGBR4<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configBReg[nIC].tx_data[4] = configBReg[nIC].tx_data[4] | ((vuv_bl & 0x0F00U) >> 0x8U);//<2F><><EFBFBD><EFBFBD>CFGBR4<52><34>4λ,<2C><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGBR4<52><34>
}
/*!
\brief Helper function to set bl_dtmen(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg: Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] dtmen : Enable discharge monitor(<EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 1: Enable discharge monitor(<EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
0: Disable discharge monitor(<EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgb_bl_dtmen(uint8_t nIC, Reg_TypeDef *configBReg,
BOOLEAN dtmen
)
{
if (dtmen)//<2F><><EFBFBD><EFBFBD>CFGAR4<52>ĵ<EFBFBD>
configBReg[nIC].tx_data[4] = configBReg[nIC].tx_data[4] | (0x01<<4);//д1,ʹ<>ܷŵ<DCB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
configBReg[nIC].tx_data[4] = configBReg[nIC].tx_data[4] & (~(0x01<<4));//д0,<2C><>ʹ<EFBFBD>ܷŵ<DCB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Helper function to set CFGRB variable(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBReg : Register group B(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] dcc : 1: Turn on the switch of Cell x(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>صĿ<EFBFBD><EFBFBD><EFBFBD>)
0: Turn off the switch of Cell x(<EFBFBD>ر<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>صĿ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] bl_duty_sel: Active balancing duty cycle selection(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] dcto : Discharge timing overflow value configuration(<EFBFBD>ŵʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] vuv_bl : Lower 8 bits of equalization undervoltage threshold(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĵ<EFBFBD>8λ)
\param[in] dtmen : Enable discharge monitor(ʹ<EFBFBD>ܷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 1: Enable discharge monitor(<EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
0: Disable discharge monitor(<EFBFBD><EFBFBD><EFBFBD>÷ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgrb(uint8_t nIC,
Reg_TypeDef *configBReg,
uint16_t dcc,//<2F>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>1:<3A><><EFBFBD><EFBFBD>Cell x <20>Ŀ<EFBFBD><C4BF><EFBFBD> 0:<3A>ر<EFBFBD>Cell x <20>Ŀ<EFBFBD><C4BF><EFBFBD><><C4AC>)
uint8_t bl_duty_sel,//<2F><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1> ռ<>ձ<EFBFBD>=(BL_DUTY_SEL+1)*10%<25><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ10%~100%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><39><CAB1>100%
uint8_t dcto,//<2F>ŵ綨ʱ<E7B6A8><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
uint16_t vuv_bl,//<2F><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
BOOLEAN dtmen//<2F><><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>DTMEN=1<><31><EFBFBD><EFBFBD>Ƿѹ(С<><D0A1>VUV_BL)<29>رշŵ翪<C5B5>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>DTMEN=0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<C7B7>Ƚ<EFBFBD>
)
{
BF8915A_set_cfgb_dcc(nIC, configBReg,dcc);//<2F><><EFBFBD>Ʒŵ<C6B7><C5B5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgb_bl_duty_sel(nIC, configBReg,bl_duty_sel);//<2F><><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1>
BF8915A_set_cfgb_dcto(nIC, configBReg,dcto);//<2F><><EFBFBD>÷ŵ綨ʱ<E7B6A8><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>õĸ<C3B5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgb_vuv_bl(nIC, configBReg,vuv_bl);//<2F><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgb_bl_dtmen(nIC, configBReg,dtmen);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷ŵ<C3B7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Helper function to set Undervoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCReg: Register group C(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] vuv_m : Undervoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>µ<EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfgc_vuv_m(uint8_t nIC, Reg_TypeDef *configCReg,uint16_t vuv_m)
{
configCReg[nIC].tx_data[0] = 0x00FF & vuv_m;//<2F><><EFBFBD><EFBFBD>CFGCR0,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[1] = configCReg[nIC].tx_data[1]&0xF0;//<2F><>CFGCR1<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[1] = configCReg[nIC].tx_data[1]|((0x0F00 & vuv_m)>>8);//<2F><><EFBFBD><EFBFBD>CFGCR1<52><31>4λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGCR1<52><31>
}
/*!
\brief Helper function to set Overvoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCReg: Register group C(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] vov_m : Overvoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>µĹ<EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfgc_vov_m(uint8_t nIC, Reg_TypeDef *configCReg,uint16_t vov_m)
{
configCReg[nIC].tx_data[2] = 0x00FF & (vov_m>>4);//<2F><><EFBFBD><EFBFBD>CFGCR2,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[1] = configCReg[nIC].tx_data[1]&0x0F;//<2F><>CFGCR1<52>ĸ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[1] = configCReg[nIC].tx_data[1]|((0x000F & vov_m)<<4);//<2F><><EFBFBD><EFBFBD>CFGCR1<52><31>4λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ѹ<EFBFBD><D1B9>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGCR1<52><31>
}
/*!
\brief Helper function to set Internal over-temperature threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCReg: Register group C(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] itov_m : In monitoring mode, internal over-temperature threshold(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfgc_itov_m(uint8_t nIC, Reg_TypeDef *configCReg,uint16_t itov_m)
{
configCReg[nIC].tx_data[3] = 0x00FF & itov_m;//<2F><><EFBFBD><EFBFBD>CFGCR3,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[4] = configCReg[nIC].tx_data[4]&0xF0;//<2F><>CFGCR4<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[4] = configCReg[nIC].tx_data[4]|((0x0F00 & itov_m)>>8);//<2F><><EFBFBD><EFBFBD>CFGCR4<52><34>4λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGCR4<52><34>
}
/*!
\brief Helper function to set external over-temperature threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCReg: Register group C(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] extov_m : In monitoring mode, external over-temperature threshold(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfgc_extov_m(uint8_t nIC, Reg_TypeDef *configCReg,uint16_t extov_m)
{
configCReg[nIC].tx_data[5] = 0x00FF & (extov_m>>4);//<2F><><EFBFBD><EFBFBD>CFGCR5,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><38><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[4] = configCReg[nIC].tx_data[4]&0x0F;//<2F><>CFGCR4<52>ĸ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configCReg[nIC].tx_data[4] = configCReg[nIC].tx_data[4]|((0x000F & extov_m)<<4);//<2F><><EFBFBD><EFBFBD>CFGCR4<52><34>4λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><34><CEBB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>CFGCR4<52><34>
}
/*!
\brief Helper function to set CFGRC variable(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCReg: Register group C(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] vuv_m : Undervoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>µ<EFBFBD>Ƿѹ<EFBFBD><EFBFBD>ֵ)
\param[in] vov_m : Overvoltage threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>µĹ<EFBFBD>ѹ<EFBFBD><EFBFBD>ֵ)
\param[in] itov_m : Internal over-temperature threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)
\param[in] extov_m : external over-temperature threshold in monitoring mode(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ)
\retval none
*/
void BF8915A_set_cfgrc(uint8_t nIC,
Reg_TypeDef *configCReg,
uint16_t vuv_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µ<EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
uint16_t vov_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µĹ<C2B5>ѹ<EFBFBD><D1B9>ֵ
uint16_t itov_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µ<EFBFBD><C2B5>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
uint16_t extov_m//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>µ<EFBFBD><C2B5>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
)
{
BF8915A_set_cfgc_vuv_m(nIC, configCReg,vuv_m);//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgc_vov_m(nIC, configCReg,vov_m);//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ù<EFBFBD>ѹ<EFBFBD><D1B9>ֵ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgc_itov_m(nIC, configCReg,itov_m);//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgc_extov_m(nIC, configCReg,extov_m);//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Helper function to set csel_m(<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] csel_m : In monitoring mode, battery voltage monitoring comparison selection cell1~cell16(<EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 ~<EFBFBD><EFBFBD><EFBFBD><EFBFBD>16)
\retval none
*/
void BF8915A_set_cfgd_csel_m(uint8_t nIC, Reg_TypeDef *configDReg,uint16_t csel_m)
{
configDReg[nIC].tx_data[0] = 0x00FF & csel_m;//<2F><><EFBFBD><EFBFBD>CFGDR0<52><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>cell1~cell8
configDReg[nIC].tx_data[1] = (csel_m & 0xFF00) >> 0x8U;//<2F><><EFBFBD><EFBFBD>CFGDR1<52><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>cell9~cell16
}
/*!
\brief Helper function to set gsel_m(<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD>GPIO0~7<EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] gsel_m : In monitoring mode, GPIO0~7 is compared and selected(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD>GPIO0~7<EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgd_gsel_m(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t gsel_m)
{
configDReg[nIC].tx_data[2] = gsel_m;//<2F><><EFBFBD><EFBFBD>CFGDR2
}
/*!
\brief Helper function to set isospi_wake_t(<EFBFBD><EFBFBD><EFBFBD>þջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] isospi_wake_t: isospi wake-up time, 0: 10us; 1:20us(isospi(<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD>SPI)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>0:10us<EFBFBD><EFBFBD>1:20us)
\retval none
*/
void BF8915A_set_cfgd_isospi_wake_t(uint8_t nIC, Reg_TypeDef *configDReg,BOOLEAN isospi_wake_t)
{
if (isospi_wake_t)//<2F><><EFBFBD><EFBFBD>CFGDR3<52>ĵ<EFBFBD>
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] | (0x01<<7);//д1
else
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] & (~(0x01<<7));//д0
}
/*!
\brief Helper function to set adc_rst_sel(<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>λѡ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] adc_rst_sel: 0: All measurement channels reset ADC(<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC)
1: Only the first channel resets ADC, then 2~n channels do not reset ADC(ֻ<EFBFBD>е<EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>2~<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC)
\retval none
*/
void BF8915A_set_cfgd_adc_rst_sel(uint8_t nIC, Reg_TypeDef *configDReg,BOOLEAN adc_rst_sel)
{
if (adc_rst_sel)//<2F><><EFBFBD><EFBFBD>CFGDR3<52>ĵ<EFBFBD>
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] | (0x01<<6);//д1
else
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] & (~(0x01<<6));//д0
}
/*!
\brief Helper function to set time_sel_m(<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] time_sel_m: In monitoring mode, timing monitoring time configuration(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
//time_sel_m(5λ):<3A><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ʱʱ<CAB1><CAB1>=(TIME_SEL_M+1)*1s(2~64s)<29><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1(2s)
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ú;<C3BA><CDBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
void BF8915A_set_cfgd_time_sel_m(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t time_sel_m)
{
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] & 0xC0U;//<2F><>CFGDR3<52><33><36><CEBB><EFBFBD><EFBFBD>
configDReg[nIC].tx_data[3] = configDReg[nIC].tx_data[3] | (time_sel_m & 0x3F);//<2F><><EFBFBD><EFBFBD>CFGDR3<52><33>
//<2F><><EFBFBD><EFBFBD>CFGDR3<52><33>
}
/*!
\brief Helper function to set adc_init_t2(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] adc_init_t2: ADC measurement 2~n channel ADC initialization time(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
\retval none
*/
//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<><6E>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD>䣬(ADC_INIT_T2+1)*20us(20~320us)
void BF8915A_set_cfgd_adc_init_t2(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t adc_init_t2)
{
configDReg[nIC].tx_data[4] = configDReg[nIC].tx_data[4] & 0x0FU;//<2F><>CFGDR4<52><34><34><CEBB><EFBFBD><EFBFBD>
configDReg[nIC].tx_data[4] = configDReg[nIC].tx_data[4] | ((adc_init_t2 & 0x0F) << 0x4U);//<2F><><EFBFBD><EFBFBD>CFGDR4<52><34>
//<2F><><EFBFBD><EFBFBD>CFGDR4<52><34>
}
/*!
\brief Helper function to set adc_init_t1(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] adc_init_t1: ADC measurement 1 channel ADC initialization time(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
\retval none
*/
//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>(ADC_INIT_T1+1)*100us(100~1600us)
void BF8915A_set_cfgd_adc_init_t1(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t adc_init_t1)
{
configDReg[nIC].tx_data[4] = configDReg[nIC].tx_data[4] & 0xF0U;//<2F><>CFGDR4<52><34><34><CEBB><EFBFBD><EFBFBD>
configDReg[nIC].tx_data[4] = configDReg[nIC].tx_data[4] | (adc_init_t1 & 0x0F);//<2F><><EFBFBD><EFBFBD>CFGDR4<52><34>
//<2F><><EFBFBD><EFBFBD>CFGDR4<52><34>
}
/*!
\brief Helper function to set trim2_en(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD>2ʹ<EFBFBD>ܵĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] trim2_en : Modification 2 enable, 1: enable, 0: disable(<EFBFBD>޵<EFBFBD>2ʹ<EFBFBD>ܣ<EFBFBD>1:ʹ<EFBFBD>ܣ<EFBFBD>0:<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgd_trim2_en(uint8_t nIC, Reg_TypeDef *configDReg,BOOLEAN trim2_en)
{
if (trim2_en)//<2F><><EFBFBD><EFBFBD>CFGDR5<52>ĵ<EFBFBD>
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] | (0x01<<7);//д1
else
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] & (~(0x01<<7));//д0
}
/*!
\brief Helper function to set trim1_en(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD>1ʹ<EFBFBD>ܵĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] trim1_en : Modification 1 enable, 1: enable, 0: disable(<EFBFBD>޵<EFBFBD>1ʹ<EFBFBD>ܣ<EFBFBD>1:ʹ<EFBFBD>ܣ<EFBFBD>0:<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_set_cfgd_trim1_en(uint8_t nIC, Reg_TypeDef *configDReg,BOOLEAN trim1_en)
{
if (trim1_en)//<2F><><EFBFBD><EFBFBD>CFGDR5<52>ĵ<EFBFBD>
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] | (0x01<<6);//д1
else
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] & (~(0x01<<6));//д0
}
/*!
\brief Helper function to set trim1_en(<EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] err_t_sel_m: When an exception occurs in the monitoring mode, the reporting interval(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
\retval none
*/
//err_t_sel_m(2λ):<3A><><EFBFBD><EFBFBD>ģʽ<C4A3>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ϱ<EFBFBD><CFB1>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1> 00:200ms<6D><73>01:400ms<6D><73>10:600ms<6D><73>11:800ms
void BF8915A_set_cfgd_err_t_sel_m(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t err_t_sel_m)
{
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] & 0xCFU;//<2F><>CFGDR5<52>ĵ<EFBFBD>6~5λ<35><CEBB><EFBFBD><EFBFBD>
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] | ((err_t_sel_m & 0x03) << 0x4U);//<2F><><EFBFBD><EFBFBD>CFGDR5<52><35>6~5λ
//<2F><><EFBFBD><EFBFBD>CFGDR5<52><35>8~7λ
}
/*!
\brief Helper function to set CFGRD variable(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] vd33t_on_m: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
//vd33t_on_m:<3A><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>VREF1(<28><>׼<EFBFBD><D7BC>ѹ)<29><>VD33T<33><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(5+VD33T_ON_M*10)ms<6D><73><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>5~155ms
void BF8915A_set_cfgd_vd33t_on_m(uint8_t nIC, Reg_TypeDef *configDReg,uint8_t vd33t_on_m)
{
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] & 0xF0U;//<2F><>CFGDR5<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>
configDReg[nIC].tx_data[5] = configDReg[nIC].tx_data[5] | (vd33t_on_m & 0x0F);//<2F><><EFBFBD><EFBFBD>CFGDR5<52><35><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CFGDR5<52><35>
}
/*!
\brief Helper function to set CFGRD variable(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] nIC : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDReg : Register group D(<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] csel_m : In monitoring mode, battery voltage monitoring comparison selection cell1~cell16(<EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1~<EFBFBD><EFBFBD><EFBFBD><EFBFBD>16)
\param[in] gsel_m : In monitoring mode, GPIO0~7 comparison selection(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD>GPIO0~7<EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] isospi_wake_t: isospi wake up time(<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
\param[in] adc_rst_sel : 0: All measurement channels reset ADC(<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC)
1: Only the first channel resets ADC, then 2~n channels do not reset ADC(ֻ<EFBFBD>е<EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>2~<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC)
\param[in] time_sel_m : In monitoring mode, timing monitoring time configuration, timing time=(TIME_SEL_M+1)*1s(2~64s), the minimum configuration value is 1(2s);This time configuration is shared with the balance period configuration
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>=(TIME_SEL_M+1)*1s(2~64s)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>1(2s)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD>)
\param[in] adc_init_t2 : ADC measures the ADC initialization time of the second to n channels, (ADC_INIT_T2+1)*20us (20~320us)(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD>(ADC_INIT_T2+1)*20us(20~320us))
\param[in] adc_init_t1 : ADC measurement of the first channel ADC initialization time (ADC_INIT_T1+1)*100us (100~1600us)(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>(ADC_INIT_T1+1)*100us(100~1600us))
\param[in] trim2_en:1 : enable, 0: disable(<EFBFBD>޵<EFBFBD>2ʹ<EFBFBD>ܣ<EFBFBD>1:ʹ<EFBFBD>ܣ<EFBFBD>0:<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>)
\param[in] trim1_en:1 : enable, 0: disable(<EFBFBD>޵<EFBFBD>1ʹ<EFBFBD>ܣ<EFBFBD>1:ʹ<EFBFBD>ܣ<EFBFBD>0:<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>)
\param[in] err_t_sel_m : 00: 200ms, 01: 400ms, 10: 600ms, 11: 800ms(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> 00:200ms<EFBFBD><EFBFBD>01:400ms<EFBFBD><EFBFBD>10:600ms<EFBFBD><EFBFBD>11:800ms)
\param[in] vd33t_on_m : The startup time configuration of VREF1 and VD33T (5+VD33T_ON_M*10)ms, the range is 5~155ms(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD>VREF1<EFBFBD><EFBFBD>VD33T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(5+VD33T_ON_M*10)ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD>5~155ms)
\retval none
*/
void BF8915A_set_cfgrd(uint8_t nIC,
Reg_TypeDef *configDReg,
uint16_t csel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>cell1~cell16
//1:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>½<EFBFBD><C2BD>й<EFBFBD>Ƿѹ<C7B7>Ƚϣ<C8BD><CFA3>ñ<EFBFBD>־λ
//0:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>²<EFBFBD><C2B2><EFBFBD><EFBFBD>й<EFBFBD>Ƿѹ<C7B7>Ƚϣ<C8BD><CFA3><EFBFBD><EFBFBD>ñ<EFBFBD>־λ
uint8_t gsel_m ,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>GPIO0~7<>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>
//1:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>½<EFBFBD><C2BD>й<EFBFBD><D0B9><EFBFBD>(С<><D0A1><EFBFBD>ⲿ<EFBFBD><EFBFBD><C2B6><EFBFBD>ֵ)<29>Ƚϣ<C8BD><CFA3>ñ<EFBFBD>־λ
//0:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>²<EFBFBD><C2B2><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>(С<><D0A1><EFBFBD>ⲿ<EFBFBD><EFBFBD><C2B6><EFBFBD>ֵ)<29>Ƚϣ<C8BD><CFA3><EFBFBD><EFBFBD>ñ<EFBFBD>־λ
BOOLEAN isospi_wake_t,//<2F>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬0: 10us<75><73>1: 20us
BOOLEAN adc_rst_sel,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>λѡ<CEBB><D1A1><EFBFBD><EFBFBD>0:<3A><><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC<44><43>1:ֻ<>е<EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>λADC<44><43>֮<EFBFBD><D6AE>2~nͨ<6E><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC
uint8_t time_sel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ʱʱ<CAB1><CAB1>=(TIME_SEL_M+1)*1s(2~64s)<29><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1(2s)
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ú;<C3BA><CDBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
uint8_t adc_init_t2,//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<><6E>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD>䣬(ADC_INIT_T2+1)*20us(20~320us)
uint8_t adc_init_t1,//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>(ADC_INIT_T1+1)*100us(100~1600us)
BOOLEAN trim2_en,//<2F>޵<EFBFBD>2ʹ<32>ܣ<EFBFBD>1:ʹ<>ܣ<EFBFBD>0:<3A><>ʹ<EFBFBD><CAB9>
BOOLEAN trim1_en,//<2F>޵<EFBFBD>1ʹ<31>ܣ<EFBFBD>1:ʹ<>ܣ<EFBFBD>0:<3A><>ʹ<EFBFBD><CAB9>
uint8_t err_t_sel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ϱ<EFBFBD><CFB1>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1>
//00:200ms<6D><73>01:400ms<6D><73>10:600ms<6D><73>11:800ms
uint8_t vd33t_on_m//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>VREF1<46><31>VD33T<33><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(5+VD33T_ON_M*10)ms<6D><73><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>5~155ms
)
{
BF8915A_set_cfgd_csel_m(nIC, configDReg,csel_m);//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_gsel_m(nIC, configDReg,gsel_m);//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ģʽ<C4A3>£<EFBFBD>GPIO0~7<>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_isospi_wake_t(nIC, configDReg,isospi_wake_t);//<2F><><EFBFBD>þջ<C3BE><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_adc_rst_sel(nIC, configDReg,adc_rst_sel);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>λѡ<CEBB><D1A1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_time_sel_m(nIC, configDReg,time_sel_m);//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_adc_init_t2(nIC, configDReg,adc_init_t2);//<2F><><EFBFBD><EFBFBD>ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<><6E>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_adc_init_t1(nIC, configDReg,adc_init_t1);//<2F><><EFBFBD><EFBFBD>ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_trim2_en(nIC, configDReg,trim2_en);//<2F><><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD>2ʹ<32>ܵĸ<DCB5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_trim1_en(nIC, configDReg,trim1_en);//<2F><><EFBFBD><EFBFBD><EFBFBD>޵<EFBFBD>1ʹ<31>ܵĸ<DCB5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_err_t_sel_m(nIC, configDReg,err_t_sel_m);//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ģʽ<C4A3>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ϱ<EFBFBD><CFB1>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_set_cfgd_vd33t_on_m(nIC, configDReg,vd33t_on_m);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Write the BF8915A CFGRA(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAData: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_wrcfga(uint8_t total_ic, ConfigA_TypeDef configAData[])
{
uint8_t cmd[2] = {0x00 , 0x01};//<2F><><EFBFBD><EFBFBD>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><41><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
uint8_t write_count = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTOTAL_IC * 0x6U
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t dataTemp = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ6<C3BF><36>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>鵱ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A
{
BF8915A_set_cfgra(current_ic,
configAArray,
configAData[current_ic].gpio_pd_en,//д0:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>1:GPIO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><><C4AC>)<29><>0 :GPIO<49>ŵ<EFBFBD>ֵ<EFBFBD><D6B5>0 <20><>1:GPIO<49>ŵ<EFBFBD>ֵ<EFBFBD><D6B5>1
configAData[current_ic].gpio_analog_en,//GPIO0~7ģʽѡ<CABD><D1A1> 0:ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1:<3A><>ͨGPIO
configAData[current_ic].adc_init_mode,
configAData[current_ic].rsvd2,//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
configAData[current_ic].rsvd1,//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
configAData[current_ic].osr_sel,//0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>64<36><34>128<32><38>256<35><36>512(<28><><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>OSRѡ<52><D1A1>)
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>λҪ<CEBB><D2AA>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>OSRһ<52><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
configAData[current_ic].refon,//VREF1(<28><>׼<EFBFBD><D7BC>ѹ)<29><><EFBFBD><EFBFBD> 1 :VREF1<46><31><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ֱ<EFBFBD><D6B1>WDT<44><54><EFBFBD><EFBFBD> 0 :ADCת<43><D7AA><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>VREF1<46>ر<EFBFBD><><C4AC>)
configAData[current_ic].uv_th,//Under voltage Comparison Voltage(Ƿѹ<C7B7><D1B9>ֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Under voltage threshold ADC Code(Ƿ<><C7B7>ѹ<EFBFBD><D1B9>ֵģ<D6B5><C4A3>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>): uv_th = 3000 * 65535U / 5000U. LSB = 0.0001 ---(3V)
configAData[current_ic].ov_th //Over voltage Comparison Voltage(<28><>ѹ<EFBFBD><D1B9>ֵ)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Over voltage threshold ADC Code(<28><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵģ<D6B5><C4A3>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>): ov_th = 4100 * 65535U / 5000U. LSB = 0.0001 ---(4.1V)
);
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><41><D6B8>
{
if (isospi_reverse == TRUE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><41><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><41><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (dataTemp = 0; dataTemp<6; dataTemp++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>úõ<C3BA><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһд<D2BB><EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ
{
write_buffer[write_count] = configAArray[c_ic].tx_data[dataTemp];
write_count++;
}
}
BF8915A_write(total_ic, cmd, write_buffer);//дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
}
/*!
\brief Write the BF8915A CFGRB(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBData: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_wrcfgb(uint8_t total_ic,
ConfigB_TypeDef configBData[]
)
{
uint8_t cmd[2] = {0x00 , 0x02};//<2F><><EFBFBD><EFBFBD>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><42><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//uint8_t write_buffer[TOTAL_IC * 0x6U];//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
uint8_t write_count = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTOTAL_IC * 0x6U
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t dataTemp = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ6<C3BF><36>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>鵱ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B
{
BF8915A_set_cfgrb(current_ic,
configBArray,
configBData[current_ic].dcc,//<2F>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>1:<3A><><EFBFBD><EFBFBD>Cell x <20>Ŀ<EFBFBD><C4BF><EFBFBD> 0:<3A>ر<EFBFBD>Cell x <20>Ŀ<EFBFBD><C4BF><EFBFBD><><C4AC>)
configBData[current_ic].bl_duty_sel,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1> ռ<>ձ<EFBFBD>=(BL_DUTY_SEL+1)*10%<25><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ10%~100%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><39><CAB1>100%<25><>
configBData[current_ic].dcto,//<2F>ŵ綨ʱ<E7B6A8><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
configBData[current_ic].vuv_bl_th,//<2F><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
configBData[current_ic].dtmen//<2F><><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>DTMEN=1<><31><EFBFBD><EFBFBD>Ƿѹ(С<><D0A1>VUV_BL)<29>رշŵ翪<C5B5>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>DTMEN=0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<C7B7>Ƚ<EFBFBD>
);
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><42><D6B8>
{
if (isospi_reverse == TRUE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><42><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><42><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (dataTemp = 0; dataTemp<6; dataTemp++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD>úõ<C3BA><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһд<D2BB><EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ
{
write_buffer[write_count] = configBArray[c_ic].tx_data[dataTemp];
write_count++;
}
}
BF8915A_write(total_ic, cmd, write_buffer);//дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
}
/*!
\brief Write the BF8915A CFGRC(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCData: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_wrcfgc(uint8_t total_ic,
ConfigC_TypeDef configCData[]
)
{
uint8_t cmd[2] = {0x00 , 0x03};//<2F><><EFBFBD><EFBFBD>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><43><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
// Reg_TypeDef configCArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹC<E1B9B9><43><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//uint8_t write_buffer[TOTAL_IC * 0x6U];//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
uint8_t write_count = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTOTAL_IC * 0x6U
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t data = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ6<C3BF><36>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>鵱ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C
{
BF8915A_set_cfgrc(current_ic,
configCArray,
configCData[current_ic].vuv_m_th,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
configCData[current_ic].vov_m_th,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ѹ<EFBFBD><D1B9>ֵ
configCData[current_ic].itov_m_th,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
configCData[current_ic].extov_m_th//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
);
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><43><D6B8>
{
if (isospi_reverse == TRUE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><43><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><43><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (data = 0; data<6; data++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>úõ<C3BA><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһд<D2BB><EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ
{
write_buffer[write_count] = configCArray[c_ic].tx_data[data];
write_count++;
}
}
BF8915A_write(total_ic, cmd, write_buffer);//дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
}
/*!
\brief Write the BF8915A CFGRD(дBF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDData: A two dimensional array of the configuration data that will be written(<EFBFBD><EFBFBD>Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_wrcfgd(uint8_t total_ic,
ConfigD_TypeDef configDData[]
)
{
uint8_t cmd[2] = {0x00 , 0x04};//<2F><><EFBFBD><EFBFBD>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><44><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//Reg_TypeDef configDArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹD<E1B9B9><44><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//uint8_t write_buffer[TOTAL_IC * 0x6U];//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
uint8_t write_count = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪTOTAL_IC * 0x6U
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t data = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ6<C3BF><36>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>鵱ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D
{
BF8915A_set_cfgrd(current_ic,
configDArray,
configDData[current_ic].csel_m, //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1> 1:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>½<EFBFBD><C2BD>й<EFBFBD>Ƿѹ<C7B7>Ƚϣ<C8BD><CFA3>ñ<EFBFBD>־λ
// 0:<3A><>Ӧ<EFBFBD>ĵ<EFBFBD><C4B5>ؾͻ<D8BE><CDBB>ڼ<EFBFBD><DABC><EFBFBD>ģʽ<C4A3>²<EFBFBD><C2B2><EFBFBD><EFBFBD>й<EFBFBD>Ƿѹ<C7B7>Ƚϣ<C8BD><CFA3><EFBFBD><EFBFBD>ñ<EFBFBD>־λ
configDData[current_ic].gsel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>GPIO0~7<>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>
configDData[current_ic].isospi_wake_t,//isospi(<28>ջ<EFBFBD><D5BB><EFBFBD>SPI)<29><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬0:10us 1:20us
configDData[current_ic].adc_rst_sel,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>λѡ<CEBB><D1A1><EFBFBD><EFBFBD>0:<3A><><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC<44><43>1:ֻ<>е<EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>λADC<44><43>֮<EFBFBD><D6AE>2~nͨ<6E><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λADC
configDData[current_ic].time_sel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ʱʱ<CAB1><CAB1>=(TIME_SEL_M+1)*1s(2~64s)<29><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1(2s)
configDData[current_ic].adc_init_t2,//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<><6E>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD>䣬(ADC_INIT_T2+1)*20us(20~320us)
configDData[current_ic].adc_init_t1,//ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>(ADC_INIT_T1+1)*100us(100~1600us)
configDData[current_ic].trim2_en,//<2F>޵<EFBFBD>2ʹ<32>ܣ<EFBFBD>1:ʹ<>ܣ<EFBFBD>0:<3A><>ʹ<EFBFBD><CAB9>
configDData[current_ic].trim1_en,//<2F>޵<EFBFBD>1ʹ<31>ܣ<EFBFBD>1:ʹ<>ܣ<EFBFBD>0:<3A><>ʹ<EFBFBD><CAB9>
configDData[current_ic].err_t_sel_m,//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ϱ<EFBFBD><CFB1>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1> 00:200ms<6D><73>01:400ms<6D><73>10:600ms<6D><73>11:800ms
configDData[current_ic].vd33t_on_m//<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>VREF1<46><31>VD33T<33><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(5+VD33T_ON_M*10)ms<6D><73><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7>5~155ms
);
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><44><D6B8>
{
if (isospi_reverse == TRUE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><44><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><44><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (data = 0; data<6; data++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD><EFBFBD>úõ<C3BA><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһд<D2BB><EFBFBD><EBB7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ
{
write_buffer[write_count] = configDArray[c_ic].tx_data[data];//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ָ<EFBFBD><D6B8>
write_count++;
}
}
BF8915A_write(total_ic, cmd, write_buffer);//дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Ч<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD>ݵ<EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
}
/*!
\brief Reads the BF8915A CFGRA register(<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configAData: A two dimensional array that the function stores the read configuration data(<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error
*/
uint8_t BF8915A_rdcfga(uint8_t total_ic,
ConfigA_TypeDef configAData[]
)
{
uint8_t cmd[2]= {0x00U, 0x05U};//<2F><><EFBFBD>Ͷ<EFBFBD>BF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><41><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//Reg_TypeDef configAArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹA<E1B9B9><41><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t read_buffer[256];//<2F>洢SPI<50>˿ڶ<CBBF>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t data_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t calc_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t byte=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ8<C3BF><38>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41>ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
pec_error = BF8915A_read(total_ic, cmd, read_buffer);//ִ<><D6B4>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>д<EFBFBD><D0B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (byte=0; byte<8; byte++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>8915AоƬ
{
configAArray[c_ic].rx_data[byte] = read_buffer[byte+(8*current_ic)];
}
calc_pec = pec15_calc(6,&read_buffer[8*current_ic]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
data_pec = read_buffer[7+(8*current_ic)] | (read_buffer[6+(8*current_ic)]<<8);//<2F><>read_buffer[]<5D>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ߵ͹<DFB5>16λ<36><CEBB><EFBFBD><EFBFBD>data_pec<65><63>
if (calc_pec != data_pec )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
configAArray[c_ic].rx_pec_match = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ
}
else configAArray[c_ic].rx_pec_match = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
{
configAData[current_ic].gpio_pd_en = configAArray[current_ic].rx_data[0];//CFGAR0<52><30><38><CEBB>GPIO<49><4F><EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD>ÿһλ<D2BB><CEBB>Ӧһ<D3A6><D2BB>IO<49><4F>
configAData[current_ic].gpio_analog_en = configAArray[current_ic].rx_data[1];//CFGAR1<52><31><38><CEBB>GPIO0~7ģʽѡ<CABD><D1A1>
configAData[current_ic].rsvd2 = (BOOLEAN)((configAArray[current_ic].rx_data[2] & 0x08U) == 0x08U);//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
configAData[current_ic].rsvd1 = (BOOLEAN)((configAArray[current_ic].rx_data[2] & 0x04U) == 0x04U);//<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>0
configAData[current_ic].osr_sel = (BOOLEAN)((configAArray[current_ic].rx_data[2] & 0x02U) == 0x02U);//CFGAR2<52>ĵ<EFBFBD>2λ,ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
configAData[current_ic].refon = (BOOLEAN)((configAArray[current_ic].rx_data[2] & 0x01U) == 0x01U);//CFGAR2<52>ĵ<EFBFBD>1λ,VREF1(<28><>׼<EFBFBD><D7BC>ѹ)<29><><EFBFBD><EFBFBD>
configAData[current_ic].uv_th = (uint16_t)(configAArray[current_ic].rx_data[3]) + (((uint16_t)((configAArray[current_ic].rx_data[4])&0x0FU)) << 0x8U);
//CFGAR3<52><33><38><CEBB>CFGAR4<52>ĵ<EFBFBD>4λ,<2C><>CFGAR1<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>12~9λ<39><CEBB>Ƿѹ<C7B7><D1B9>ֵ
configAData[current_ic].ov_th = (((uint16_t)configAArray[current_ic].rx_data[5]) << 0x4U) + (((configAArray[current_ic].rx_data[4])&0xF0U) >> 0x4U);
//CFGAR5<52><35><38><CEBB>CFGAR4<52>ĸ<EFBFBD>4λ,<2C><>CFGAR4<52>ĸ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>12~9λ<39><CEBB><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵ
configAData[current_ic].rx_pec_match = configAArray[current_ic].rx_pec_match;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
}
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads the BF8915A CFGRB register(<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configBData: A two dimensional array that the function stores the read configuration data(<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error
*/
uint8_t BF8915A_rdcfgb(uint8_t total_ic,
ConfigB_TypeDef configBData[]
)
{
uint8_t cmd[2]= {0x00 , 0x06};//<2F><><EFBFBD>Ͷ<EFBFBD>BF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><42><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//Reg_TypeDef configBArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹB<E1B9B9><42><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t read_buffer[256];//<2F>洢SPI<50>˿ڶ<CBBF>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t data_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t calc_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t byte=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ8<C3BF><38>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
pec_error = BF8915A_read(total_ic, cmd, read_buffer);//ִ<><D6B4>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>д<EFBFBD><D0B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (byte=0; byte<8; byte++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>8915AоƬ
{
configBArray[c_ic].rx_data[byte] = read_buffer[byte+(8*current_ic)];
}
calc_pec = pec15_calc(6,&read_buffer[8*current_ic]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
data_pec = read_buffer[7+(8*current_ic)] | (read_buffer[6+(8*current_ic)]<<8);//<2F><>read_buffer[]<5D>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ߵ͹<DFB5>16λ<36><CEBB><EFBFBD><EFBFBD>data_pec<65><63>
if (calc_pec != data_pec )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
configBArray[c_ic].rx_pec_match = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ
}
else configBArray[c_ic].rx_pec_match = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
{
configBData[current_ic].dcc = (((uint16_t)configBArray[current_ic].rx_data[1]) << 0x8U) + configBArray[current_ic].rx_data[0];
//CFGBR0<52><30><38><CEBB>CFGBR1<52><31>8λ,<2C><>CFGBR1<52><31><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>
configBData[current_ic].bl_duty_sel = (configBArray[current_ic].rx_data[2] & 0xF0U) >> 0x4U;//CFGBR2<52>ĸ<EFBFBD>4λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>ѡ<EFBFBD><D1A1>
configBData[current_ic].dcto = configBArray[current_ic].rx_data[2] & 0x0FU;//CFGBR2<52>ĵ<EFBFBD>4λ,<2C>ŵ綨ʱ<E7B6A8><CAB1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
configBData[current_ic].vuv_bl_th = (uint16_t)configBArray[current_ic].rx_data[3] + (((uint16_t)(configBArray[current_ic].rx_data[4] & 0x0F)) << 0x8U);
//CFGBR3<52><33><38><CEBB>CFGBR4<52>ĵ<EFBFBD>4λ,<2C><>CFGBR1<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>12~9λ<39><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
configBData[current_ic].dtmen = (BOOLEAN)((configBArray[current_ic].rx_data[4] & 0x10U) == 0x10U);//CFGBR4<52>ĵ<EFBFBD>5λ,ʹ<>ܷŵ<DCB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
configBData[current_ic].rx_pec_match = configBArray[current_ic].rx_pec_match;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
}
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads the BF8915A CFGRC register(<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configCData: A two dimensional array that the function stores the read configuration data(<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
uint8_t BF8915A_rdcfgc(uint8_t total_ic,
ConfigC_TypeDef configCData[]
)
{
uint8_t cmd[2]= {0x00 , 0x07};//<2F><><EFBFBD>Ͷ<EFBFBD>BF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><43><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//Reg_TypeDef configCArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹC<E1B9B9><43><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t read_buffer[256];//<2F>洢SPI<50>˿ڶ<CBBF>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t data_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t calc_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><43>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t byte=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ8<C3BF><38>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
pec_error = BF8915A_read(total_ic, cmd, read_buffer);//ִ<><D6B4>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>е<EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>д<EFBFBD><D0B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (byte=0; byte<8; byte++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>8915AоƬ
{
configCArray[c_ic].rx_data[byte] = read_buffer[byte+(8*current_ic)];
}
calc_pec = pec15_calc(6,&read_buffer[8*current_ic]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
data_pec = read_buffer[7+(8*current_ic)] | (read_buffer[6+(8*current_ic)]<<8);//<2F><>read_buffer[]<5D>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ߵ͹<DFB5>16λ<36><CEBB><EFBFBD><EFBFBD>data_pec<65><63>
if (calc_pec != data_pec )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
configCArray[c_ic].rx_pec_match = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ
}
else configCArray[c_ic].rx_pec_match = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
{
configCData[current_ic].vuv_m_th = configCArray[current_ic].rx_data[0] + (((uint16_t)(configCArray[current_ic].rx_data[1] & 0x0F)) << 0x8U);
//CFGCR0<52><30><38><CEBB>CFGCR1<52>ĵ<EFBFBD>4λ,<2C><>CFGCR1<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>12~9λ<39><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>Ƿѹ<C7B7><D1B9>ֵ
configCData[current_ic].vov_m_th = (((uint16_t)configCArray[current_ic].rx_data[2]) << 0x4U) + ((configCArray[current_ic].rx_data[1] & 0xF0) >> 0x04U);
//CFGCR1<52>ĸ<EFBFBD><34><CEBB>CFGCR2<52><32>8λ,<2C><>CFGCR1<52><31><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><34><CEBB><EFBFBD><EFBFBD>CFGCR2<52><32><38><CEBB><EFBFBD><EFBFBD>12~5λ<35><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ѹ<EFBFBD><D1B9>ֵ
configCData[current_ic].itov_m_th = configCArray[current_ic].rx_data[3] + (((uint16_t)(configCArray[current_ic].rx_data[4] & 0x0F)) << 0x8U);
//CFGBC3<43><33><38><CEBB>CFGCR1<52>ĵ<EFBFBD>4λ,<2C><>CFGCR4<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD>12~9λ<39><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
configCData[current_ic].extov_m_th = (((uint16_t)configCArray[current_ic].rx_data[5]) << 0x4U) + ((configCArray[current_ic].rx_data[4] & 0xF0) >> 0x04U);
//CFGCR4<52>ĸ<EFBFBD><34><CEBB>CFGCR5<52><35>8λ,<2C><>CFGCR4<52><34><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><34><CEBB><EFBFBD><EFBFBD>CFGCR5<52><35><38><CEBB><EFBFBD><EFBFBD>12~5λ<35><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
configCData[current_ic].rx_pec_match = configCArray[current_ic].rx_pec_match;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
}
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads the BF8915A CFGRD register(<EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D)
\param[in] total_ic : Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] configDData: A two dimensional array that the function stores the read configuration data(<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĶ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
uint8_t BF8915A_rdcfgd(uint8_t total_ic,
ConfigD_TypeDef configDData[]
)
{
uint8_t cmd[2]= {0x00 , 0x08};//<2F><><EFBFBD>Ͷ<EFBFBD>BF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><44><D6B8><EFBFBD>ĸߵ͹<DFB5>16λ
//Reg_TypeDef configDArray[TOTAL_IC];//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E1B9B9>ΪReg_TypeDef<65><66><EFBFBD><EFBFBD><EFBFBD>ݽṹD<E1B9B9><44><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڴ洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t read_buffer[256] = {0};//<2F>洢SPI<50>˿ڶ<CBBF>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t data_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t calc_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD><44>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t byte=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ8<C3BF><38>һѭ<D2BB><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD>е<EFBFBD>ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
pec_error = BF8915A_read(total_ic, cmd, read_buffer);//ִ<><D6B4>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>е<EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>д<EFBFBD><D0B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
for (byte=0; byte<8; byte++)//<2F><>isospiһֱΪFALSE<53><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD>8915AоƬ
{
configDArray[c_ic].rx_data[byte] = read_buffer[byte+(8*current_ic)];
}
calc_pec = pec15_calc(6,&read_buffer[8*current_ic]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
data_pec = read_buffer[7+(8*current_ic)] | (read_buffer[6+(8*current_ic)]<<8);//<2F><>read_buffer[]<5D>н<EFBFBD><D0BD>յ<EFBFBD><D5B5><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD>ߵ͹<DFB5>16λ<36><CEBB><EFBFBD><EFBFBD>data_pec<65><63>
if (calc_pec != data_pec )//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
configDArray[c_ic].rx_pec_match = 1U;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB2BB>ȷ
pec_error = 1U;
}
else configDArray[c_ic].rx_pec_match = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
}
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>8915AоƬ<D0BE><C6AC><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8>
{
configDData[current_ic].csel_m = (((uint16_t)configDArray[current_ic].rx_data[1]) << 0x8U) + configDArray[current_ic].rx_data[0];
//CFGDR0<52><30><38><CEBB>CFGDR1<52><31>8λ,<2C><>CFGDR1<52><31><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>
configDData[current_ic].gsel_m = configDArray[current_ic].rx_data[2];//CFGDR2<52><32>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>GPIO0~7<>Ƚ<EFBFBD>ѡ<EFBFBD><D1A1>
configDData[current_ic].isospi_wake_t = (BOOLEAN)((configDArray[current_ic].rx_data[3] & 0x80) == 0x80);//CFGDR3<52>ĵ<EFBFBD>8λ,<2C>ջ<EFBFBD><D5BB><EFBFBD>SPI<50>Ļ<EFBFBD><C4BB><EFBFBD>ʱ<EFBFBD><CAB1>
configDData[current_ic].adc_rst_sel = (BOOLEAN)((configDArray[current_ic].rx_data[3] & 0x40) == 0x40);//CFGDR3<52>ĵ<EFBFBD>7λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>λѡ<CEBB><D1A1>
configDData[current_ic].time_sel_m = configDArray[current_ic].rx_data[3] & 0x3F;//CFGDR3<52><33>6~1λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
configDData[current_ic].adc_init_t2 = (configDArray[current_ic].rx_data[4] & 0xF0) >> 0x4U;//CFGDR4<52>ĸ<EFBFBD>4λ,ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2~n<><6E>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
configDData[current_ic].adc_init_t1 = configDArray[current_ic].rx_data[4] & 0x0F;//CFGDR4<52>ĵ<EFBFBD>4λ,ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>ADC<44><43>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
configDData[current_ic].trim2_en = (BOOLEAN)((configDArray[current_ic].rx_data[5] & 0x80) == 0x80U);//CFGDR5<52>ĵ<EFBFBD>8λ,<2C>޵<EFBFBD>2ʹ<32><CAB9>
configDData[current_ic].trim1_en = (BOOLEAN)((configDArray[current_ic].rx_data[5] & 0x40) == 0x40U);//CFGDR5<52>ĵ<EFBFBD>7λ,<2C>޵<EFBFBD>1ʹ<31><CAB9>
configDData[current_ic].err_t_sel_m = (configDArray[current_ic].rx_data[5] & 0x30) >> 0x4U; //CFGDR5<52>ĵ<EFBFBD>6~5λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD>ϱ<EFBFBD><CFB1>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1>
configDData[current_ic].vd33t_on_m = configDArray[current_ic].rx_data[5] & 0x0F;//CFGDR5<52>ĵ<EFBFBD>4λ,<2C><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD>VREF1<46><31>VD33T<33><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
configDData[current_ic].rx_pec_match = configDArray[current_ic].rx_pec_match;//ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
}
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief ADCV CMD(<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹADCת<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] DISCP : DISCP_DISABLE<EFBFBD><EFBFBD>DISCP_ENABLE(<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ:<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λд0<EFBFBD><EFBFBD>1)
\param[in] CSEL : CSEL_CH_ALL<EFBFBD><EFBFBD>CSEL_CH_1and9<EFBFBD><EFBFBD>CSEL_CH_2and10<EFBFBD><EFBFBD>CSEL_CH_3and11<EFBFBD><EFBFBD>CSEL_CH_4and12
CSEL_CH_5and13<EFBFBD><EFBFBD>CSEL_CH_6and14<EFBFBD><EFBFBD>CSEL_CH_7and15<EFBFBD><EFBFBD>CSEL_CH_8and16
(ADCת<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>(0)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>9(1)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>10(2)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>11(3)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><EFBFBD>12(4)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>13(5)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>14(6)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7<EFBFBD><EFBFBD>15(7)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD>16(8))
\retval none
*/
void BF8915A_adcv(uint8_t CLKSEL,
uint8_t OSR,
uint8_t DISCP,
uint8_t CSEL
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_ADCV << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_ADCV 0x1U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (DISCP<<4) | CSEL;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADCV <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief CVST CMD(<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_2566<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] SFTEST: SELFTEST_6666 SELFTEST_9999(<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>ģʽѡ<EFBFBD><EFBFBD>:<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>2)
\retval none
*/
void BF8915A_cvst(uint8_t CLKSEL,
uint8_t OSR,
uint8_t SFTEST
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_CVST << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_CVST 0x03U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (SFTEST<<4);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CVST <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief ADOL CMD(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] DISCP : DISCP_DISABLE<EFBFBD><EFBFBD>DISCP_ENABLE (<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ:<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λд0<EFBFBD><EFBFBD>1)
\retval none
*/
void BF8915A_adol(uint8_t CLKSEL,
uint8_t OSR,
uint8_t DISCP
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_ADOL << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_ADOL 0x04U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (DISCP<<4) | 0x01U;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADOL <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief ADGP CMD(GPIO ADCת<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] GSEL : GSEL_CH_ALL<EFBFBD><EFBFBD> GSEL_CH_GPIO0<EFBFBD><EFBFBD>GSEL_CH_GPIO1<EFBFBD><EFBFBD>GSEL_CH_GPIO2<EFBFBD><EFBFBD>GSEL_CH_GPIO3
GSEL_CH_VD33T<EFBFBD><EFBFBD>GSEL_CH_GPIO4<EFBFBD><EFBFBD>GSEL_CH_GPIO5<EFBFBD><EFBFBD>GSEL_CH_GPIO6<EFBFBD><EFBFBD>GSEL_CH_GPIO7
(ADCת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIOѡ<EFBFBD><EFBFBD> :<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO0~GPIO7,VD33T<EFBFBD><EFBFBD>GPIO0<EFBFBD><EFBFBD>GPIO1<EFBFBD><EFBFBD>GPIO2<EFBFBD><EFBFBD>GPIO3
VD33T<EFBFBD><EFBFBD>GPIO4<EFBFBD><EFBFBD>GPIO5<EFBFBD><EFBFBD>GPIO6<EFBFBD><EFBFBD>GPIO7)
\retval none
*/
void BF8915A_adgp(uint8_t CLKSEL,
uint8_t OSR,
uint8_t GSEL
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_ADGP << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_ADGP 0x05U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | GSEL;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADGP <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief GPST CMD(GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] SFTEST: SELFTEST_6666 SELFTEST_9999(<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>ģʽѡ<EFBFBD><EFBFBD>:<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>2)
\retval none
*/
void BF8915A_gpst(uint8_t CLKSEL,
uint8_t OSR,
uint8_t SFTEST
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_GPST << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_GPST 0x07U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (SFTEST<<4);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPST <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief ADSTAT CMD(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] STSEL : STATA<EFBFBD><EFBFBD>STATB<EFBFBD><EFBFBD>STATC<EFBFBD><EFBFBD>STATD(ADCת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_adstat(uint8_t CLKSEL,
uint8_t OSR,
uint8_t STSEL
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_ADSTAT << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_ADSTAT 0x08U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | STSEL;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADSTAT <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief STATST CMD(<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] SFTEST: SELFTEST_6666 SELFTEST_9999(<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>ģʽѡ<EFBFBD><EFBFBD>:<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>2)
\retval none
*/
void BF8915A_statst(uint8_t CLKSEL,
uint8_t OSR,
uint8_t SFTEST
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_STATST << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_STATST 0x09U
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (SFTEST<<4);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CMD_STATST <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief ADCVGP CMD(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] DISCP : DISCP_DISABLE<EFBFBD><EFBFBD>DISCP_ENABLE(<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ:<EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λд0<EFBFBD><EFBFBD>1)
\retval none
*/
void BF8915A_adcvgp(uint8_t CLKSEL,
uint8_t OSR,
uint8_t DISCP
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_ADCVGP << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_ADCVGP 0x0aU
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (DISCP<<4);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CMD_ADCVGP <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief MNT CMD(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>:0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3)
\param[in] MNMOD : MNMOD_DISABLE<EFBFBD><EFBFBD>MNMOD_1<EFBFBD><EFBFBD>MNMOD_2<EFBFBD><EFBFBD>MNMOD_3(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽѡ<EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч(00)<EFBFBD><EFBFBD>ģʽ1(01)<EFBFBD><EFBFBD>ģʽ2(02)<EFBFBD><EFBFBD>ģʽ3(03))
\param[in] STRMN : STRMN_ENABLE<EFBFBD><EFBFBD>STRMN_DISABLE(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽʹ<EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ(1)<EFBFBD><EFBFBD><EFBFBD>رռ<EFBFBD><EFBFBD><EFBFBD>ģʽ(2))
\param[in] BLEN : BLEN_ON<EFBFBD><EFBFBD>BLEN_OFF (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>2:<EFBFBD>ر<EFBFBD>(0)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1))
\retval none
*/
void BF8915A_mnt(uint8_t CLKSEL,
uint8_t OSR,
uint8_t MNMOD,
uint8_t STRMN,
uint8_t BLEN
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32> λ<>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_MNT << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_MNT 0x0cU
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (MNMOD<<3) | (STRMN << 2) | BLEN ;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CMD_MNT <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief STRBL CMD(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>)
\param[in] CLKSEL: CLKSEL_2M
\param[in] OSR : OSR_64 <EFBFBD><EFBFBD>OSR_128<EFBFBD><EFBFBD>OSR_256<EFBFBD><EFBFBD>OSR_512(ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>)
\param[in] OESEL : OESEL_ODD<EFBFBD><EFBFBD>OESEL_EVEN (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>żѡ<EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0)<EFBFBD><EFBFBD>ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1))
\param[in] BLEN : BLEN_ON<EFBFBD><EFBFBD>BLEN_OFF(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> 2:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1)<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>(0))
\retval none
*/
void BF8915A_strbl(uint8_t CLKSEL,
uint8_t OSR,
uint8_t OESEL,
uint8_t BLEN
)
{
uint8_t cmd[2] = {0U};//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t clksel_bits = 0x0U;//<2F><><EFBFBD><EFBFBD>CLKSEL<45><4C>2<EFBFBD><32>λ <20>ı<EFBFBD><C4B1><EFBFBD>
clksel_bits = (CLKSEL & 0x02) >> 1;//<2F><><EFBFBD><EFBFBD>CLKSEL[1]
cmd[0] = clksel_bits + (CMD_STRBL << 0x1U);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>8λ,#define CMD_STRBL 0x0dU
clksel_bits = (CLKSEL & 0x01) << 7;//<2F><><EFBFBD><EFBFBD>CLKSEL[0]
cmd[1] = clksel_bits | (OSR<<5) | (OESEL<<4) | BLEN;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>8λ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CMD_STRBL <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Reads the raw cell voltage register data(<EFBFBD><EFBFBD>ȡԭʼ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] reg : Determines which register is read back(ȷ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic: the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] cellData: Array of the unparsed codes(δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_rdcv_reg(uint8_t reg, //Determines which cell voltage register is read back(ȷ<><C8B7><EFBFBD>ض<EFBFBD><D8B6>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>)
uint8_t total_ic,
uint8_t *cellData
)
{
const uint8_t REG_LEN = 8; //number of 6 bytes in each ICs register + 2 bytes for the PEC(ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>·<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD>)
uint8_t cmd[4];//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[0] = 0x00;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = reg + 0x08U;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915A.h<>ļ<EFBFBD><C4BC><EFBFBD> <20><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,cellData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,cellData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
/*!
\brief reads BF8915A GPIO registers(<EFBFBD><EFBFBD>ȡBF8915A<EFBFBD><EFBFBD>GPIO<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
The function reads a single GPIO voltage register and stores the read data in the *data point as a byte array.
This function is rarely used outside of the BF8915A_rdgv() command.
(<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*data<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>˹<EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BF8915A_rdgv()<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>ʹ<EFBFBD>á<EFBFBD>)
\param[in] reg : Determines which register is read back(ȷ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic: the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] gpioData: Array of the unparsed codes(δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_rdgv_reg(uint8_t reg,
uint8_t total_ic,
uint8_t *gpioData
)
{
const uint8_t REG_LEN = 8; // number of 6 bytes in the register + 2 bytes for the PEC(<28>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD>)
uint8_t cmd[4];//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[0] = 0x00;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = reg + 0x0EU;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915A.h<>ļ<EFBFBD><C4BC><EFBFBD> GPIOG<4F><47>ѹ
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,gpioData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,gpioData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
/*!
\brief Reads BF8915A stat registers(<EFBFBD><EFBFBD>ȡBF8915A״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] reg : Determines which register is read back(ȷ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic: the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] statData: Array of the unparsed codes(δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval none
*/
void BF8915A_rdstat_reg(uint8_t reg,
uint8_t total_ic,
uint8_t *statData
)
{
const uint8_t REG_LEN = 8;//number of 6 bytes in the register + 2 bytes for the PEC(<28>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD>)
uint8_t cmd[4];//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[0] = 0x00;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = reg + 0x11;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915A.h<>ļ<EFBFBD><C4BC><EFBFBD> ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>RDSTAT
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,statData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_read(cmd,4,statData,(REG_LEN*total_ic));//ʹ<><CAB9>SPI<50>˿<EFBFBD>д<EFBFBD><D0B4><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
/*!
\brief Helper function that parses voltage measurement registers(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] current_ic: Number of ics in current cycle(<EFBFBD><EFBFBD>ǰѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD>)
\param[in] cell_reg : Controls which cell voltage register is read back(<EFBFBD><EFBFBD><EFBFBD>ƻض<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] cell_data : Number of bytes of data received(<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+2<EFBFBD><EFBFBD>PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>))
\param[in] cell_codes: cell voltage value(<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹֵ)
\param[in] ic_pec : If a PEC error was detected during most recent read cmd(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ȡcmd(ָ<EFBFBD><EFBFBD>)<EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error
*/
uint8_t parse_cells(uint8_t current_ic,
uint8_t cell_reg,
uint8_t cell_data[],
uint16_t *cell_codes,
uint8_t *ic_pec
)
{
const uint8_t BYT_IN_REG = 6;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
uint8_t CELL_IN_REG = 3;//ÿ<><C3BF><EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> 3<><33><EFBFBD><EFBFBD>ѹֵ
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t parsed_cell;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹֵ
uint16_t received_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t data_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t data_counter = current_ic*NUM_RX_BYT; //data counter(<28><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>)
uint8_t current_cell = 0;//ÿ<><C3BF><EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>鵱ǰѭ<C7B0><D1AD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ
for (current_cell = 0; current_cell < CELL_IN_REG; current_cell++) // This loop parses the read back data into cell voltages, it loops once for each of the 3 cell voltage codes in the register
{ //(<28><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ԼĴ<D4BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD>ÿ3<C3BF><33><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѭ<EFBFBD><D1AD>һ<EFBFBD><D2BB>)
parsed_cell = cell_data[data_counter] + ((uint16_t)cell_data[data_counter + 1] << 8);//Each cell codes is received as two bytes and is combined to create the parsed cell voltage code
//(ÿ<><C3BF><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EBB1BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
cell_codes[current_cell + ((cell_reg - 1) * CELL_IN_REG)] = parsed_cell;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cell_codes[]<5D><>
data_counter = data_counter + 2;//Because cell voltage codes are two bytes the data counter must increment by two for each parsed cell code
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
if(cell_reg == CVFR)//#define CVFR 0x06U
{
current_cell = 0x3U;//<2F><><EFBFBD>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ<EFBFBD>Ľṹ<C4BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16<31><36>Ԫ<EFBFBD>أ<EFBFBD><D8A3>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CVFR(<28><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>F)ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
if(cell_reg == CVFR)//<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ΪCVFR<46><52><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѭ<EFBFBD><D1AD>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
{
data_counter = data_counter + 4;
}
received_pec = (cell_data[data_counter] << 8) | cell_data[data_counter+1]; //The received PEC for the current_ic is transmitted as the 7th and 8th after the 6 cell voltage data bytes
//(<28><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>current_ic(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>)<29><>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><>Ϊ6<CEAA><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD>7<EFBFBD><37><EFBFBD>͵<EFBFBD>8<EFBFBD><38><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD>)
data_pec = pec15_calc(BYT_IN_REG, &cell_data[(current_ic) * NUM_RX_BYT]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (received_pec != data_pec)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
pec_error = 1; //The pec_error variable is simply set 1 if any PEC errors(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>pec<65><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pec_error<6F><72><EFBFBD><EFBFBD><EFBFBD>򵥵<EFBFBD><F2B5A5B5><EFBFBD><EFBFBD><EFBFBD>Ϊ1)
ic_pec[cell_reg-1]=1;//<2F><>cellVoltage[c_ic].pec_match[0]<5D>е<EFBFBD>ֵ<EFBFBD><D6B5>1
}
else
{
ic_pec[cell_reg-1]=0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>cellVoltage[c_ic].pec_match[0]<5D>е<EFBFBD>ֵ<EFBFBD><D6B5>0
}
data_counter=data_counter+2;//Because the transmitted PEC code is 2 bytes long the data_counter must be incremented by 2 bytes to point to the next ICs state voltage data
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڲ<D6BD><DAB2><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>8915A״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads and parses the BF8915A cell voltage registers(<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BF8915A<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] reg : Controls which cell voltage register is read back(<EFBFBD><EFBFBD><EFBFBD>ƻض<EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic : the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] CellVoltage_TypeDef: CellVoltage Struct(<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>)
\retval the time of pec_error(pec_error<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*/
uint8_t BF8915A_rdcv(uint8_t reg,
uint8_t total_ic,
CellVoltage_TypeDef *cellVoltage
)
{
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t *cell_data;//<2F><>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><38><CEBB>ָ<EFBFBD><D6B8>cell_data
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t cell_reg = 1;//<2F><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cell_data = (uint8_t *) malloc((NUM_RX_BYT*total_ic)*sizeof(uint8_t));//#define NUM_RX_BYT 0x8U(<28><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>+2<><32>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ֽ<EFBFBD>)
if (reg == 0)//<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD><D0B5>ص<EFBFBD>ѹ
{
for (cell_reg = 1; cell_reg < NUM_CV_REG + 1; cell_reg++) //#define NUM_CV_REG 6U,<2C><>ÿ<EFBFBD><C3BF>BF8915A<35><41><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
{
BF8915A_rdcv_reg(cell_reg, total_ic,cell_data );//<2F><>ȡԭʼ<D4AD><CABC><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (current_ic = 0; current_ic < total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD>ĵ<EFBFBD><C4B5>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
pec_error = pec_error + parse_cells(current_ic,cell_reg, cell_data,
&cellVoltage[c_ic].cellVoltage[0],
&cellVoltage[c_ic].pec_match[0]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
}
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD><D0B5>ص<EFBFBD>ѹ
{
BF8915A_rdcv_reg(reg, total_ic,cell_data);//<2F><>ȡԭʼ<D4AD><CABC><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD>ĵ<EFBFBD><C4B5>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
pec_error = pec_error + parse_cells(current_ic,reg, cell_data,
&cellVoltage[c_ic].cellVoltage[0],
&cellVoltage[c_ic].pec_match[0]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
}
free(cell_data);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
return(pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads and parses the BF8915A GPIO registers(<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BF8915A GPIO<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] reg : Determines which GPIO voltage register is read back(ȷ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ĸ<EFBFBD>GPIO<EFBFBD><EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic : the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] gpioVoltage: A two dimensional array of the gpio voltage codes(GPIO<EFBFBD><EFBFBD>ѹ<EFBFBD>Ķ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error
*/
uint8_t BF8915A_rdgv(uint8_t reg,
uint8_t total_ic,
GPIOReg_TypeDef *gpioVoltage
)
{
uint8_t *dataPtr;//<2F><>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><38><CEBB>ָ<EFBFBD><D6B8>dataPtr
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t c_ic =0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t gpio_reg = 1;//GPIO<49>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
dataPtr = (uint8_t *) malloc((NUM_RX_BYT*total_ic)*sizeof(uint8_t));//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>dataPtr<74><72>Ҫ<EFBFBD><D2AA><EFBFBD>յij<D5B5><C4B3><EFBFBD>
//#define NUM_RX_BYT 0x8U(<28><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>+2<><32>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ֽ<EFBFBD>)
if (reg == 0)//<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
for (gpio_reg = 1; gpio_reg < NUM_GOIO_REG + 1; gpio_reg++) //#define NUM_STAT_REG 3U,<2C><>ÿ<EFBFBD><C3BF>BF8915A<35><41>GPIO<49><4F>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
{
BF8915A_rdgv_reg(gpio_reg, total_ic,dataPtr);//Reads the raw gpio register data into the data[] array(<28><>ԭʼGPIO<49>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>data[]<5D><><EFBFBD><EFBFBD>)
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
pec_error = parse_cells(current_ic,gpio_reg, dataPtr,
&gpioVoltage[c_ic].gpioVoltage[0],
&gpioVoltage[c_ic].pec_match[0]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
}
}
else//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
BF8915A_rdgv_reg(reg, total_ic, dataPtr);//Reads the raw gpio register data into the data[] array(<28><>ԭʼGPIO<49>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>data[]<5D><><EFBFBD><EFBFBD>)
for (current_ic = 0; current_ic<total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<49><4F>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
pec_error = parse_cells(current_ic,reg, dataPtr,
&gpioVoltage[c_ic].gpioVoltage[0],
&gpioVoltage[c_ic].pec_match[0]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
}
free(dataPtr);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
return (pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Reads and parses the BF8915A stat registers(<EFBFBD><EFBFBD>ȡ<EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD>BF8915A״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] reg : Determines which Stat register is read back(ȷ<EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>ĸ<EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] total_ic : the Number of ICs in the system(ϵͳ<EFBFBD><EFBFBD>IC(8915A)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\param[in] StateReg_TypeDef: A two dimensional array of the state codes(״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
\retval pec_error
*/
uint8_t BF8915A_rdstat(uint8_t reg,
uint8_t total_ic,
StateReg_TypeDef *stateReg
)
{
const uint8_t BYT_IN_REG = 6;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>6<EFBFBD><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>
const uint8_t GPIO_IN_REG = 3;//ÿ<><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> 3<><33><EFBFBD><EFBFBD>ѹֵ
uint8_t *dataPtr;//<2F><>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><38><CEBB>ָ<EFBFBD><D6B8>dataPtr
uint8_t data_counter = 0;//data counter(<28><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>)
uint8_t pec_error = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t parsed_stat;//<2F><><EFBFBD><EFBFBD>״ֵ̬
uint16_t received_pec;//<2F>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint16_t data_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t c_ic = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8915AоƬ<D0BE><C6AC><EFBFBD><EFBFBD>
uint8_t stat_reg = 1;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
uint8_t current_ic = 0;//current_ic is used as the IC counter(<28><>ǰIC(8915A)<29><><EFBFBD><EFBFBD>IC(8915A)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
uint8_t current_gpio = 0;//<2F><>ǰ<EFBFBD><C7B0><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹֵ
uint8_t stateD_byte = 0;//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڼ<D6BD><DABC><EFBFBD><EFBFBD><EFBFBD>
uint8_t stateD_bit = 0;//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dataPtr = (uint8_t *) malloc((NUM_RX_BYT*total_ic)*sizeof(uint8_t));//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>dataPtr<74><72>Ҫ<EFBFBD><D2AA><EFBFBD>յij<D5B5><C4B3><EFBFBD>
if (reg == 0)//<2F><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
{
for (stat_reg = 1; stat_reg < NUM_STAT_REG + 0x1U; stat_reg++)//#define NUM_STAT_REG 4U,<2C><>ÿ<EFBFBD><C3BF>BF8915A<35><41>״̬<D7B4><CCAC>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD><D2BB>
{
data_counter = 0;//data counter(<28><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>)
BF8915A_rdstat_reg(stat_reg, total_ic,dataPtr);//Reads the raw status register data into the dataPtr[] array(<28><>ԭʼ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>dataPtr[]<5D><><EFBFBD><EFBFBD>)
for (current_ic = 0 ; current_ic < total_ic; current_ic++)//<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
if ((stat_reg > 0) && (stat_reg < 4))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>ΪSTATA<54><41>STATB<54><42>STATC
{
for (current_gpio = 0; current_gpio < GPIO_IN_REG; current_gpio++) // This loop parses the read back data into state voltages, it loops once for each of the 3 state voltage codes in the register
{ //(<28><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ϊ״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ԼĴ<D4BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD>3<EFBFBD><33>״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ÿһ<C3BF><D2BB>ѭ<EFBFBD><D1AD>һ<EFBFBD><D2BB>)
parsed_stat = dataPtr[data_counter] + (dataPtr[data_counter+1]<<8);//Each state codes is received as two bytes and is combined to create the parsed state voltage code
//(ÿ<><C3BF>״̬<D7B4><EFBFBD><EBB1BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
stateReg[c_ic].stat_codes[current_gpio + (stat_reg - 1) * GPIO_IN_REG] = parsed_stat;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>stateReg[c_ic].stat_codes[]<5D><>
data_counter=data_counter+2;//Because cell voltage codes are two bytes the data counter must increment by two for each parsed cell code
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
if((reg == STATC) &&(current_gpio == 0x1U)) //<2F>˴<EFBFBD><CBB4>ж<EFBFBD>δ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><D6B9>STATCʱ,<2C><><EFBFBD><EFBFBD>StateReg_TypeDef<65><EFBFBD><E1B9B9><EFBFBD><EFBFBD>stat_codes[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
current_gpio = GPIO_IN_REG;//<2F>Ĵ<EFBFBD><C4B4><EFBFBD>ΪSTATC<54><43><EFBFBD>Ѿ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD>
data_counter = data_counter+2;//Because cell voltage codes are two bytes the data counter must increment by two for each parsed cell code
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
}
}
}
else if (stat_reg == 4)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>ΪSTATD
{
stateReg[c_ic].uvOvFlags[0] = dataPtr[data_counter++];//STDR0<52><30><38><CEBB>Cell1~Cell4<6C><34>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[1] = dataPtr[data_counter++];//STDR1<52><31><38><CEBB>Cell5~Cell8<6C><38>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[2] = dataPtr[data_counter++];//STDR2<52><32><38><CEBB>Cell9~Cell12<31><32>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[3] = dataPtr[data_counter++];//STDR3<52><33><38><CEBB>Cell12~Cell16<31><36>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].cfg_err = ((dataPtr[data_counter] & 0x40) >> 0x6U);//STDR4<52>ĵ<EFBFBD><37><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ECCУ<43><D0A3>)
stateReg[c_ic].pec_err = ((dataPtr[data_counter] & 0x20) >> 0x5U);//STDR4<52>ĵ<EFBFBD><36><CEBB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PECУ<43><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
stateReg[c_ic].extov = ((dataPtr[data_counter] & 0x10) >> 0x4U);//STDR4<52>ĵ<EFBFBD><35><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><EFBFBD>(gpio)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].itov = ((dataPtr[data_counter] & 0x08) >> 0x3U);//STDR4<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD>(vtemp)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].htov2 = ((dataPtr[data_counter] & 0x04) >> 0x2U);//STDR4<52>ĵ<EFBFBD><33><CEBB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>(95<39><35>)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].htov1 = ((dataPtr[data_counter] & 0x02) >> 0x1U);//STDR4<52>ĵ<EFBFBD><32><CEBB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>(125<32><35>)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].mux_fail = (dataPtr[data_counter++] & 0x01);//STDR4<52>ĵ<EFBFBD><31><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>
stateReg[c_ic].mode_state = ((dataPtr[data_counter] & 0xC0U) >> 0x6U);//STDR5<52>ĵ<EFBFBD>8~7λ<37><CEBB>ģʽ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
stateReg[c_ic].rst_state = (dataPtr[data_counter++] & 0x3FU);//STDR5<52>ĵ<EFBFBD>6~1λ<31><CEBB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>־<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
stateReg[c_ic].cellOvFlag = 0x00U;//<2F><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9>־λ<D6BE><CEBB>ÿ<EFBFBD><C3BF>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ÿ<D6BE><C3BF><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>Ƿѹ<C7B7><D1B9>־λ
stateReg[c_ic].cellUvFlag = 0x00U;//<2F><><EFBFBD>ع<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE><CEBB>ÿ<EFBFBD><C3BF>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־ÿ<D6BE><C3BF><EFBFBD><EFBFBD><EFBFBD>صĹ<D8B5>ѹ<EFBFBD><D1B9>־λ
for(stateD_byte = 0;stateD_byte < 4;stateD_byte ++)//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ѭ<EFBFBD><D1AD>
{
for(stateD_bit = 0;stateD_bit < 4;stateD_bit ++)//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>λѭ<CEBB><D1AD>
{
if((stateReg[c_ic].uvOvFlags[stateD_byte] & (0x01 << (stateD_bit * 0x2U))) == (0x01 << stateD_bit * 0x2U))//<2F>жϸ<D0B6>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE>Ƿ<EFBFBD>Ϊ1
stateReg[c_ic].cellUvFlag |= 0x0001 << ((stateD_byte * 0x4U) + stateD_bit);//<2F><>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE><CEBB>1
else
stateReg[c_ic].cellUvFlag &= ~(0x0001 << ((stateD_byte * 0x4U) + stateD_bit));//<2F><>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE><CEBB>0
if((stateReg[c_ic].uvOvFlags[stateD_byte] & (0x01 << (stateD_bit * 0x2U + 0x1U))) == (0x01 << (stateD_bit * 0x2U + 0x1U)))//<2F>жϸ<D0B6>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE>Ƿ<EFBFBD>Ϊ1
stateReg[c_ic].cellOvFlag |= 0x0001 << ((stateD_byte * 0x4U) + stateD_bit);//<2F><>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE><CEBB>1
else
stateReg[c_ic].cellOvFlag &= ~(0x0001 << ((stateD_byte * 0x4U) + stateD_bit));//<2F><>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE><CEBB>0
}
}
}
received_pec = (dataPtr[data_counter]<<8)+ dataPtr[data_counter+1];//<2F><><EFBFBD>յ<EFBFBD><D5B5>ĵ<EFBFBD>ǰIC(8915A)<29><>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><>Ϊ6<CEAA><36>״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD>7<EFBFBD><37><EFBFBD>͵<EFBFBD>8<EFBFBD><38><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD>
data_pec = pec15_calc(BYT_IN_REG, &dataPtr[current_ic*NUM_RX_BYT]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (received_pec != data_pec)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
pec_error = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pec_error<6F><72><EFBFBD><EFBFBD><EFBFBD>򵥵<EFBFBD><F2B5A5B5><EFBFBD><EFBFBD><EFBFBD>Ϊ1
stateReg[c_ic].pec_match[stat_reg-1]=1;//stateReg[c_ic].pec_match[stat_reg-1]<5D>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1
}
else
{
stateReg[c_ic].pec_match[stat_reg-1]=0;//stateReg[c_ic].pec_match[stat_reg-1]<5D>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0
}
data_counter = data_counter + 2;//Because the transmitted PEC code is 2 bytes long the data_counter must be incremented by 2 bytes to point to the next ICs state voltage data
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڲ<D6BD><DAB2><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>·״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
}
}
}
else
{
BF8915A_rdstat_reg(reg, total_ic, dataPtr);//Reads the raw status register data into the dataPtr[] array(<28><>ԭʼ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>dataPtr[]<5D><><EFBFBD><EFBFBD>)
for (current_ic = 0 ; current_ic < total_ic; current_ic++) //<2F><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>BF8915A<35><41>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ѹ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
{
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
c_ic = current_ic;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
c_ic = total_ic - current_ic - 1;//ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD>򽫵<EFBFBD><F2BDABB5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
if ((reg > 0) && (reg <4))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>ΪSTATA<54><41>STATB<54><42>STATC
{
for (current_gpio = 0; current_gpio< GPIO_IN_REG; current_gpio++) //This loop parses the read back data into state voltages, it loops once for each of the 3 state voltage codes in the register
{ //(<28><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ϊ״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ԼĴ<D4BC><C4B4><EFBFBD><EFBFBD>е<EFBFBD>3<EFBFBD><33>״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD>е<EFBFBD>ÿһ<C3BF><D2BB>ѭ<EFBFBD><D1AD>һ<EFBFBD><D2BB>)
parsed_stat = dataPtr[data_counter] + (dataPtr[data_counter+1]<<8);//Each state codes is received as two bytes and is combined to create the parsed state voltage code
//(ÿ<><C3BF>״̬<D7B4><EFBFBD><EBB1BB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
stateReg[c_ic].stat_codes[current_gpio + (reg - 1) * GPIO_IN_REG] = parsed_stat;
data_counter = data_counter+2;//Because state voltage codes are two bytes the data counter must increment by two for each parsed state voltage code
//(<28><>Ϊ״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ѹ<EFBFBD><EFBFBD><EBA3AC><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
if((reg == STATC) &&(current_gpio == 0x1U)) //<2F>˴<EFBFBD><CBB4>ж<EFBFBD>δ<EFBFBD>˷<EFBFBD>ֹ<EFBFBD><D6B9>STATCʱ,<2C><><EFBFBD><EFBFBD>StateReg_TypeDef<65><EFBFBD><E1B9B9><EFBFBD><EFBFBD>stat_codes[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
current_gpio = GPIO_IN_REG;//<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ΪSTATC<54><43><EFBFBD>Ѿ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD>
data_counter = data_counter+2;//Because cell voltage codes are two bytes the data counter must increment by two for each parsed cell code
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2)
}
}
}
else if (reg == 4)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>ΪSTATD
{
stateReg[c_ic].uvOvFlags[0] = dataPtr[data_counter++];//STDR0<52><30><38><CEBB>Cell1~Cell4<6C><34>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[1] = dataPtr[data_counter++];//STDR1<52><31><38><CEBB>Cell5~Cell8<6C><38>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[2] = dataPtr[data_counter++];//STDR2<52><32><38><CEBB>Cell9~Cell12<31><32>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].uvOvFlags[3] = dataPtr[data_counter++];//STDR3<52><33><38><CEBB>Cell12~Cell16<31><36>Ƿ/<2F><>ѹ<EFBFBD><D1B9>־
stateReg[c_ic].cfg_err = ((dataPtr[data_counter] & 0x40) >> 0x6U);//STDR4<52>ĵ<EFBFBD><37><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ECCУ<43><D0A3>)
stateReg[c_ic].pec_err = ((dataPtr[data_counter] & 0x20) >> 0x5U);//STDR4<52>ĵ<EFBFBD><36><CEBB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>PECУ<43><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
stateReg[c_ic].extov = ((dataPtr[data_counter] & 0x10) >> 0x4U);//STDR4<52>ĵ<EFBFBD><35><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ⲿ<EFBFBD><EFBFBD>(gpio)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].itov = ((dataPtr[data_counter] & 0x08) >> 0x3U);//STDR4<52>ĵ<EFBFBD><34><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3>ڲ<EFBFBD><DAB2><EFBFBD>(vtemp)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].htov2 = ((dataPtr[data_counter] & 0x04) >> 0x2U);//STDR4<52>ĵ<EFBFBD><33><CEBB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>(95<39><35>)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].htov1 = ((dataPtr[data_counter] & 0x02) >> 0x1U);//STDR4<52>ĵ<EFBFBD><32><CEBB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>(125<32><35>)<29><><EFBFBD>±<EFBFBD>־
stateReg[c_ic].mux_fail = (dataPtr[data_counter++] & 0x01);//STDR4<52>ĵ<EFBFBD><31><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>
stateReg[c_ic].mode_state = ((dataPtr[data_counter] & 0xC0U) >> 0x6U);//STDR5<52>ĵ<EFBFBD>8~7λ<37><CEBB>ģʽ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
stateReg[c_ic].rst_state = (dataPtr[data_counter++] & 0x3FU);//STDR5<52>ĵ<EFBFBD>6~1λ<31><CEBB><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>־<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
for(stateD_byte = 0;stateD_byte < 4;stateD_byte ++)//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ѭ<EFBFBD><D1AD>
{
for(stateD_bit = 0;stateD_bit < 4;stateD_bit ++)//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>λѭ<CEBB><D1AD>
{
if((stateReg[c_ic].uvOvFlags[stateD_byte] & (0x01 << (stateD_bit * 0x2U))) == (0x01 << stateD_bit * 0x2U))//<2F>жϸ<D0B6>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE>Ƿ<EFBFBD>Ϊ1
stateReg[c_ic].cellUvFlag |= 0x0001 << ((stateD_byte * 0x4U) + stateD_bit);//<2F><>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE><CEBB>1
else
stateReg[c_ic].cellUvFlag &= ~(0x0001 << ((stateD_byte * 0x4U) + stateD_bit));//<2F><>Cellx<6C><78>Ƿѹ<C7B7><D1B9>־λ<D6BE><CEBB>0
if((stateReg[c_ic].uvOvFlags[stateD_byte] & (0x01 << (stateD_bit * 0x2U + 0x1U))) == (0x01 << (stateD_bit * 0x2U + 0x1U)))//<2F>жϸ<D0B6>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE>Ƿ<EFBFBD>Ϊ1
stateReg[c_ic].cellOvFlag |= 0x0001 << ((stateD_byte * 0x4U) + stateD_bit);//<2F><>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE><CEBB>1
else
stateReg[c_ic].cellOvFlag &= ~(0x0001 << ((stateD_byte * 0x4U) + stateD_bit));//<2F><>Cellx<6C>Ĺ<EFBFBD>ѹ<EFBFBD><D1B9>־λ<D6BE><CEBB>0
}
}
}
received_pec = (dataPtr[data_counter]<<8)+ dataPtr[data_counter+1];//The received PEC for the current_ic is transmitted as the 7th and 8th after the 6 gpio voltage data bytes
//(<28><><EFBFBD>յ<EFBFBD><D5B5>ļ<EFBFBD><C4BC>ɵ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6<CEAA><36>GPIO<49><4F>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD>7<EFBFBD><37><EFBFBD>͵<EFBFBD>8<EFBFBD><38><EFBFBD>ֽڷ<D6BD><DAB7><EFBFBD>)
data_pec = pec15_calc(BYT_IN_REG, &dataPtr[current_ic*NUM_RX_BYT]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>(6<><36><38>Ĵ<EFBFBD><C4B4><EFBFBD>)<29>е<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (received_pec != data_pec)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
{
pec_error = 1;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pec_error<6F><72><EFBFBD><EFBFBD><EFBFBD>򵥵<EFBFBD><F2B5A5B5><EFBFBD><EFBFBD><EFBFBD>Ϊ1
stateReg[c_ic].pec_match[reg-1]=1;//stateReg[c_ic].pec_match[stat_reg-1]<5D>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1
}
data_counter = data_counter + 2;//Because the transmitted PEC code is 2 bytes long the data_counter must be incremented by 2 bytes to point to the next ICs state voltage data
//(<28><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڳ<D6BD><DAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>ֽڲ<D6BD><DAB2><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>·״̬<D7B4><CCAC>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>)
}
}
free(dataPtr);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
return (pec_error);//<2F>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
}
/*!
\brief Clear Cell Register(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] none
\retval none
*/
void BF8915A_clrcell(void)
{
uint8_t cmd[2]= {0x00 , 0x81};
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Clear GPIO Register(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIO<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] none
\retval none
*/
void BF8915A_clrgp(void)
{
uint8_t cmd[2]= {0x00 , 0x82};
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief Clear STATE Register(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>)
\param[in] none
\retval none
*/
void BF8915A_clrstat(void)
{
uint8_t cmd[2]= {0x00 , 0x83};
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief PLADC CMD(<EFBFBD><EFBFBD>ѯADCת<EFBFBD><EFBFBD>״ָ̬<EFBFBD><EFBFBD>)
\param[in] none
\retval none
*/
uint8_t BF8915A_pladc(void)
{
uint8_t cmd[4];//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cmd[]
uint8_t adc_state = 0xFF;//<2F><>ʼ<EFBFBD><CABC>adc_state
uint16_t cmd_pec;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[0] = 0x00;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĸ<EFBFBD>
cmd[1] = 0x84;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>
cmd_pec = pec15_calc(2, cmd);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
cmd[2] = (uint8_t)(cmd_pec >> 8);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĸ߰<C4B8>λ
cmd[3] = (uint8_t)(cmd_pec);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>PEC(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>ĵͰ<C4B5>λ
if (isospi_reverse == FALSE)//<2F>ж<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>ľջ<C4BE><D5BB><EFBFBD>ͨ<EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>
{
cs_low();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(4,cmd);//<2F><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
adc_state = SPI1_ReadWriteByte(0xFF);//<2F><><EFBFBD><EFBFBD>SPI<50><49><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(adc_state == 0xff)
{
cs_high();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
else
{
cs_low_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ
spi_write_array(4,cmd);//<2F><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>SPI<50>˿<EFBFBD>
adc_state = SPI2_ReadWriteByte(0xFF);//<2F><><EFBFBD><EFBFBD>SPI<50><49><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(adc_state == 0xff)
{
cs_high_reverse();//<2F><>ƬѡCS<43><53><EFBFBD><EFBFBD>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ
}
}
return(adc_state);//<2F>ش<EFBFBD>SPI<50><49><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*!
\brief soft reset(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ)
\param[in] none
\retval none
*/
void BF8915A_softrst(void)
{
uint8_t cmd[2]= {0x00 , 0x55};
BF8915A_cmd(cmd);//<2F><>дBF8915A<35><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊcmd<6D><64><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>˼<EFBFBD><CBBC><EFBFBD><EFBFBD><EFBFBD>
}