工具与软件:
*我编辑是因为我在代码中发现了一个错误,但仍然无法工作。*
您好!
我正在对电量监测计进行编程、并且通过访问 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的目的是什么?
卡洛斯





