工具与软件:
*我编辑是因为我在代码中发现了一个错误,但仍然无法工作。*
您好!
我正在对电量监测计进行编程、并且通过访问 UNSEALED 模式进入校准模式。 不过、当我读取 CONTROL_STATUS 寄存器(通过发送{0x00、0x01、0x00、0x00})时、我始终得到0x0000。 我是这样做的:
以下是启用校准模式的函数:
void gau_enable_calib(void)
{
uint8_t u8OperationConfALowW[2];
uint8_t u8OperationConfAHighW[2];
uint8_t u8AccumW[2];
// uint8_t u8OpConfAR;
uint8_t u8AccMode = 0xA5;
uint8_t u8LenW[2];
uint8_t u8ChecksumW[2];
uint8_t u8GauStartW[3];
uint8_t u8EnableCalW[3];
bool boolStatusAccumW = false;
bool boolStatusEnableCal = false;
bool boolStatusGauStartW = false;
/*Enable DF write*/
gau_flash_write_enable();
/*Manufacturer access control Operation Config A decomposition addresses*/
gau_MAC_decomp(u8OperationConfALowW, u8OperationConfAHighW, u16OperationConfigA);
/*Gauge start address decomposition*/
gau_address_decomp(u8GauStartW, u16GauStart);
/*Enable calibration address decomposition*/
gau_address_decomp(u8EnableCalW, u16EnableCal);
/*Access Operation Config A in little endian format*/
gau_flash_access(u8OperationConfALowW, u8OperationConfAHighW);
/*MAC data to change to ACCUMULATOR mode*/
u8AccumW[0] = 0x40;
u8AccumW[1] = u8AccMode;
/*Change to ACCUMULATOR mode*/
boolStatusAccumW = SERCOM4_I2C_Write(u8GaugeAddrW, u8AccumW, sizeof(u8AccumW));
while(SERCOM4_I2C_IsBusy());
uint8_t u8Checksum = ~(u8OperationConfALowW[1] + u8OperationConfAHighW[1] + u8AccMode) & 0xFF;
/*Write Operation Config A checksum*/
gau_checksum_get_write(u8Checksum, u8ChecksumW);
/*Write Operation Config A length*/
gau_length_get_write(u8LenW, u8OperationConfALowW[1], u8OperationConfAHighW[1], u8AccMode, u8Checksum, 0, 0, 0);
/*Enable calibration*/
boolStatusEnableCal = SERCOM4_I2C_Write(u8GaugeAddrW, u8EnableCalW, sizeof(u8EnableCalW));
while (SERCOM4_I2C_IsBusy());
/*Gauge enable (PA18 in final product and demo) HIGH*/
PORT_PinSet(PORT_PIN_PA18);
boolStatusGauStartW = SERCOM4_I2C_Write(u8GaugeAddrW, u8GauStartW, sizeof(u8GauStartW));
while(SERCOM4_I2C_IsBusy());
}
我尝试访问 UNSEALED 模式的函数是这样的:
void gau_flash_write_enable(void)
{
uint8_t u8Unsealed1W[3];
uint8_t u8Unsealed2W[3];
uint8_t u8BlockDataW[2];
bool boolStatusUnsealed1W = false;
bool boolStatusUnsealed2W = false;
bool boolStatusBlockDataW = false;
/*Control and UNSEALED mode step 1 decomposition addresses*/
gau_MAC_decomp(u8Unsealed1LowW, u8Unsealed1HighW, u16UnsealedMode1);
/*Control and UNSEALED mode step 2 decomposition addresses*/
gau_MAC_decomp(u8Unsealed2LowW, u8Unsealed2HighW, u16UnsealedMode2);
/*Block Data control addresses*/
u8BlockDataW[0] = BLK_DATA_CTRL;
u8BlockDataW[1] = 0x00;
/*Enter UNSEALED mode*/
gau_flash_access(u8Unsealed1LowW, u8Unsealed1HighW);
gau_flash_access(u8Unsealed2LowW, u8Unsealed2HighW);
/*Enable writing in DF*/
boolStatusBlockDataW = SERCOM4_I2C_Write(u8GaugeAddrW, &u8BlockDataW[0], sizeof(u8BlockDataW));
while(SERCOM4_I2C_IsBusy());
}
Gau_MAC_decomp ()函数用于解封步骤1/2中的值0x0414和0x3672并通过0x3E 和0x3F 以小端字节序发送该值。 顺便说一下、FullUnseal 步骤1/2的目的是什么?
卡洛斯