This commit is contained in:
2026-06-15 15:51:05 +09:00
parent eef0056485
commit f4b5cfc54a
9 changed files with 263 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MCU
IIC
WDG -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> <20><>
ICCOM
SPI
PORT
GPT
DIO
19.4.0 SPI<50><49> <20><><EFBFBD><EFBFBD><EFBFBD>ϴٰ<CFB4> <20><>Ƽ<EFBFBD><C6BC> <20>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.

View File

@@ -0,0 +1,68 @@
void PMIC_I2C_1Byte_Write_with_crc(uint8 slaveIdx, uint16 regAdd, uint8 data)
{
uint8 targetPage = (uint8)((regAdd >> 8) & 0xFF);
uint8 targetAddr = (uint8) (regAdd & 0xFF);
uint8 txBuf[3]; /* [Address, Data, CRC] */
uint8 crcInput[4]; /* Maximum 4 bytes for Read-back CRC */
uint8 slaveAddr = (uint8)CddIic_GaaSlaveConfig[slaveIdx].ulSlaveAddress;
/* 1. Page Switching Logic with CRC8 */
if (g_pmic_current_page[slaveIdx] != targetPage)
{
uint8 pgRxBuf[2];
txBuf[0] = 0x00; /* Page Selector Register */
txBuf[1] = targetPage; /* This is 0x01 */
crcInput[0] = (slaveAddr << 1) | 0x00U;
crcInput[1] = txBuf[0];
crcInput[2] = txBuf[1];
txBuf[2] = crc8(crcInput, 3);
/* [Spec] Page Write - 1st */
IIC_Reset();
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
/* [Spec] Page Write - 2nd */
IIC_Reset();
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
/* [Spec] Page Read-back Verification */
IIC_Reset();
CddIic_Ch0WriteRead(&txBuf[0], 1, &pgRxBuf[0], 2, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
crcInput[0] = (slaveAddr << 1) | 0x00U;
crcInput[1] = 0x00;
crcInput[2] = (slaveAddr << 1) | 0x01U;
crcInput[3] = pgRxBuf[0];
if ((crc8(crcInput, 4) == pgRxBuf[1]) && (pgRxBuf[0] == targetPage))
{
g_pmic_current_page[slaveIdx] = targetPage;
}
else
{
g_pmic_current_page[slaveIdx] = 0xFF;
return;
}
}
/* 2. Actual Data Write with CRC8 */
/* RE-INITIALIZE txBuf and crcInput with correct values (targetAddr=0x07, data=0x84) */
txBuf[0] = targetAddr; /* 0x07 */
txBuf[1] = data; /* 0x84 - <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> */
/* Calculate CRC specifically for this write operation */
crcInput[0] = (slaveAddr << 1) | 0x00U;
crcInput[1] = txBuf[0]; /* 0x07 */
crcInput[2] = txBuf[1]; /* 0x84 */
txBuf[2] = crc8(crcInput, 3);
IIC_Reset();
/* Expecting Packet: SlaveID + 0x07 + 0x84 + CRC */
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
}

View File

@@ -0,0 +1,70 @@
void PMIC_I2C_1Byte_Write_with_crc(uint8 slaveIdx, uint16 regAdd, uint8 data)
{
uint8 targetPage = (uint8)((regAdd >> 8) & 0xFF);
uint8 targetAddr = (uint8)(regAdd & 0xFF);
uint8 txBuf[3]; /* [Address, Data, CRC] */
uint8 crcInput[4]; /* Maximum 4 bytes for Read-back CRC */
uint8 slaveAddr = (uint8)CddIic_GaaSlaveConfig[slaveIdx].ulSlaveAddress;
/* 1. Page Switching Logic with CRC8 */
if (g_pmic_current_page[slaveIdx] != targetPage)
{
uint8 pgRxBuf[2]; /* [Data, CRC] */
/* Prepare Page Change Packet: Reg 0x00, Target Page */
txBuf[0] = 0x00; /* Page Selector Register */
txBuf[1] = targetPage;
/* CRC for Write: SlaveAddr(W) + RegAddr + Data */
crcInput[0] = (slaveAddr << 1) | 0x00U;
crcInput[1] = txBuf[0];
crcInput[2] = txBuf[1];
txBuf[2] = crc8(crcInput, 3);
/* [Spec] 1st Page Write with CRC */
IIC_Reset();
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
/* [Spec] 2nd Page Write with CRC */
IIC_Reset();
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
/* [Spec] Page Read-back Verification with CRC */
IIC_Reset();
/* Use WriteRead (Repeated Start) to read Reg 0x00 */
CddIic_Ch0WriteRead(&txBuf[0], 1, &pgRxBuf[0], 2, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
/* [Modified] Verify Read-back CRC: SlaveAddr(W) + RegAddr + SlaveAddr(R) + Received Data */
crcInput[0] = (slaveAddr << 1) | 0x00U; /* Slave(W) */
crcInput[1] = 0x00; /* Register Address (Page Selector) */
crcInput[2] = (slaveAddr << 1) | 0x01U; /* Slave(R) */
crcInput[3] = pgRxBuf[0]; /* Received Page Value */
if ((crc8(crcInput, 4) == pgRxBuf[1]) && (pgRxBuf[0] == targetPage))
{
g_pmic_current_page[slaveIdx] = targetPage;
}
else
{
g_pmic_current_page[slaveIdx] = 0xFF; /* Switch failed or CRC error */
return;
}
}
/* 2. Actual Data Write with CRC8 */
txBuf[0] = targetAddr;
txBuf[1] = data;
/* CRC for Write: SlaveAddr(W) + RegAddr + Data */
crcInput[0] = (slaveAddr << 1) | 0x00U;
crcInput[1] = txBuf[0];
crcInput[2] = txBuf[1];
txBuf[2] = crc8(crcInput, 3);
IIC_Reset();
CddIic_Ch0Write(&txBuf[0], 3, &CddIic_GaaSlaveConfig[slaveIdx]);
I2C_Communication_Complete();
}