#include "demo.h"
#include "BL6523.h"
#include "lxzh.h"
//uint8_t BL6523B_Data_Read[3];
//uint8_t BL6523B_Data_Write[3] = {0,0,0};
INT32U bl6523b_IA,bl6523b_IB,bl6523b_V;
/*
*********************************************************************************************************
* 函 数 名: bsp_InitBL6523
* 功能说明: 配置STM32的GPIO和SPI接口,用于连接 BL6523
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitBL6523(void)
{
uint16_t n;
GPIO_InitTypeDef GPIO_InitStructure;
CS_1();
SCK_1();
DI_1();
/* 打开GPIO时钟 */
RCC_APB2PeriphClockCmd(RCC_SCK | RCC_DIN | RCC_DOUT | RCC_CS, ENABLE);
/* 配置几个推完输出IO */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出模式最大速度50MHz
GPIO_InitStructure.GPIO_Pin = PIN_SCK;
GPIO_Init(PORT_SCK, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_DIN;
GPIO_Init(PORT_DIN, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_CS;
GPIO_Init(PORT_CS, &GPIO_InitStructure);
/* 配置GPIO为浮动输入模式(实际上CPU复位后就是输入状态) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /* 设为输入口 */
GPIO_InitStructure.GPIO_Pin = PIN_DOUT;
GPIO_Init(PORT_DOUT, &GPIO_InitStructure);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
CS_1(); //写入8个0xFF进行软复位
BL6523_Delay();
SCK_0();
BL6523_Delay();
CS_0();
BL6523_Delay();
for(n = 0; n < 8*8; n++)
{
SCK_0();
BL6523_Delay();
DI_1();
BL6523_Delay();
SCK_1(); //SCLK=1;在 SCLK 的上升沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}
SCK_0(); //SCLK=0
CS_1(); //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
/*
*********************************************************************************************************
* 函 数 名: BL6523_Delay
* 功能说明:
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void BL6523_Delay(void)
{
uint16_t i;
for (i = 0; i < 5; i++);
}
INT32U SPI_Read(INT8U Cmd)
//SPI Read data
{
int8_t n,m;
uint8_t BL6523B_Data_Read[3];
CS_1();
BL6523_Delay();
SCK_0();
BL6523_Delay();
CS_0();
BL6523_Delay();
/* //发送命令字节
for(n=7;n>=0;n--)
{
SCK_0();
BL6523_Delay();
if(ValBit(Cmd,n)==0) //MCU 从命令字节的最高位开始发送数据到 DIN 管脚
DI_0();
else
DI_1();
BL6523_Delay();
SCK_1(); //SCLK=1;在 SCLK 的上升沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}*/
for(n = 0; n < 8; n++)
{
SCK_0();
BL6523_Delay();
if (Cmd & 0x80)
{
DI_1();
}
else
{
DI_0();
}
Cmd <<= 1;
BL6523_Delay();
SCK_1(); //SCLK=1;在 SCLK 的上升沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}
SCK_0(); //SCLK=0
bsp_DelayMS(18);
//BL6523B 从 DOUT 管脚输出 3 个字节的数据
for(m=2;m>=0;m--)
{
for(n=7;n>=0;n--)
{
SCK_1(); //SCLK=1
BL6523_Delay();
SCK_0(); //SCLK=0
BL6523_Delay();
//MCU 从 DOUT 管脚接收数据
BL6523B_Data_Read[m]=BL6523B_Data_Read[m]<<1;
if(DO_IS_HIGH())
BL6523B_Data_Read[m]=BL6523B_Data_Read[m]+1;
BL6523_Delay();
}
}
CS_1(); //
BL6523_Delay();
SCK_0(); //SCLK=0
return BL6523B_Data_Read[2]*65536 + BL6523B_Data_Read[1]*256 + BL6523B_Data_Read[0];
}
void SPI_Write(INT8U Cmd , INT32U data)
{
s8 n,m;
// uint8_t BL6523B_Data_Read[3];
uint8_t BL6523B_Data_Write[3];
data = data & 0x00FFFFFF;
BL6523B_Data_Write[0] = data;
BL6523B_Data_Write[1] = data>>8;
BL6523B_Data_Write[2] = data>>16;
Cmd=Cmd|0x40; //写入数据时 Cmd 的最高两位应为 01;
CS_1(); //CS=1
BL6523_Delay();
SCK_0(); //SCLK=0
BL6523_Delay();
CS_0();//CS=0
BL6523_Delay();
/* for(n=7;n>=0;n--)
{
SCK_0(); //SCLK=0
if(ValBit(Cmd,n)==0) //MCU 从命令字节的最高位开始发送数据到 DIN 管脚
DI_0();
else
DI_1();
BL6523_Delay();
SCK_1(); //SCLK=1 在 SCLK 的上升 沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}*/
for(n = 0; n < 8; n++)
{
SCK_0();
BL6523_Delay();
if (Cmd & 0x80)
{
DI_1();
}
else
{
DI_0();
}
Cmd <<= 1;
BL6523_Delay();
SCK_1(); //SCLK=1;在 SCLK 的上升沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}
SCK_0(); //SCLK=0
for(m=2;m>=0;m--)
{
for(n=7;n>=0;n--)
{
SCK_0(); //SCLK=0
if((BL6523B_Data_Write[m]&((u8)1<<n))==0) //MCU 发送数据字节(从高到低)
DI_0();
else
DI_1();
BL6523_Delay();
SCK_1(); //SCLK=1 在 SCLK 的上升沿 DIN 上的数据被移入 BL6523B
BL6523_Delay();
}
}
SCK_0(); //SCLK=0
bsp_DelayMS(18);
CS_1(); //CS=1,结束 SPI 通信
}
/*********************************************************************************************************
* 函 数 名: bsp_DelayMS
* 功能说明: ms级延迟,延迟精度为正负1ms
* 形 参: n : 延迟长度,单位1 ms。 n 应大于2
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t n)
{
OSTimeDlyHMSM(0,0,0,n);
}
void BL6523B_Write(INT8U Cmd , INT32U data)
{
SPI_Write(0x3E,0x55);//解锁
SPI_Write(Cmd,data); //写入
SPI_Write(0x3E,0xAA);//上锁
}
INT32U BL6523B_ReadIA(void) //读A端电流
{
INT32U temp_sum=0,temp[20];
INT8U i;
// BL6523B_Write(0x14,0x80);//
for(i=0; i<20; i++)
{
temp[i] = SPI_Read(0x05);
OSTimeDlyHMSM(0, 0, 0, 110);
}
sort32(temp,20);//排序
for(i=2; i<18; i++)//去掉2个最小和2个最大
{
temp_sum += temp[i];
}
return temp_sum/16; //平均值
}
INT32U BL6523B_ReadIB(void) //读B端电流
{
// BL6523B_Write(0x14,0x81);//
return SPI_Read(0x06);//
}
INT32U BL6523B_ReadV(void) //读电压
{
// BL6523B_Write(0x14,0x81);//
return SPI_Read(0x07);//
}