你好、
对 OTP 存储器进行编程时、遇到 PGA308问题。 所有 OTP 寄存器返回0xFF。 系统在整个过程中都由5V 电源供电。
以下是我的校准步骤:
1) 1) 在软件锁定模式下运行校准循环-没问题。 以下是我为此实现的函数:
void calRunInRam(int8_t coarse_offset)
{
uint16_t cfg0 = 0x0000;
cfg0 = cfg0 | PGA308_OUTPUT_GAIN__2 << 13; //Output gain in the D[15:13]
cfg0 = cfg0 | (0 << 12); // Input mux in D12
cfg0 = cfg0 | PGA308_INPUT_GAIN__200 << 8; // Input gain in D[11:8]
if (coarse_offset < 0){
cfg0 = cfg0 | 0x80 | abs(coarse_offset); // Offset in D[7:0]
} else {
cfg0 = cfg0 | abs(coarse_offset); // Offset in D[7:0]
}
bankValues[PGA308_REG__ZDAC] = 0x0000;
bankValues[PGA308_REG__GDAC] = 0x4000;
bankValues[PGA308_REG__CFG0] = cfg0;
bankValues[PGA308_REG__CFG1] = 0x1780;
//bankValues[PGA308_REG__CFG2] = 0x0C00; // for 5V system
bankValues[PGA308_REG__CFG2] = 0x0800; // for 3V system
bankValues[PGA308_REG__CHKS] = calculateChecksum(bankValues, 5);
// Enter Software Lock Mode
writeRAMReg(PGA308_REG__SFTC, PGA308_SFTC__SWL_SOFTLOCK);
// Write stored registers
writeRAMReg(PGA308_REG__ZDAC, bankValues[PGA308_REG__ZDAC]);
writeRAMReg(PGA308_REG__GDAC, bankValues[PGA308_REG__GDAC]);
writeRAMReg(PGA308_REG__CFG0, bankValues[PGA308_REG__CFG0]);
writeRAMReg(PGA308_REG__CFG1, bankValues[PGA308_REG__CFG1]);
writeRAMReg(PGA308_REG__CFG2, bankValues[PGA308_REG__CFG2]);
writeRAMReg(PGA308_REG__CHKS, bankValues[PGA308_REG__CHKS]);
}
2) 2) Loop 也会通过 I2C 轮询 PGA、一旦我们达到中程读取值、我想将校准值写入 OTP。
3) 3)写入 OTP 如下:
void calSaveIntoOTPMem(int8_t coarse_offset)
{
// Enter standalone mode
writeRAMReg(PGA308_REG__SFTC, 0x0000);
writeRAMReg(PGA308_REG__OTPS, 0x8000); // OTP EN
readRAMReg(PGA308_REG__OTPS);
//lets write all the registers first
writeOTPReg(PGA308_BANK__U1, PGA308_REG__ZDAC, bankValues[PGA308_REG__ZDAC]);
writeOTPReg(PGA308_BANK__U1, PGA308_REG__GDAC, bankValues[PGA308_REG__GDAC]);
writeOTPReg(PGA308_BANK__U1, PGA308_REG__CFG0, bankValues[PGA308_REG__CFG0]);
writeOTPReg(PGA308_BANK__U1, PGA308_REG__CFG1, bankValues[PGA308_REG__CFG1]);
writeOTPReg(PGA308_BANK__U1, PGA308_REG__CFG2, bankValues[PGA308_REG__CFG2]);
writeOTPReg(PGA308_BANK__U1, PGA308_REG__CHKS, bankValues[PGA308_REG__CHKS]);
writeOTPReg(PGA308_BANK__FTEST, PGA308_OTP_REG_BSEL1, 0x0001);
writeRAMReg(PGA308_REG__OTPS, 0x0000); // OTP EN
writeRAMReg(PGA308_REG__SFTC, 0x0000);
delay(3);
//lets confirm all the registers by reading them
readRAMReg(PGA308_REG__SFTC);
readRAMReg(PGA308_REG__OTPS);
readOTPReg(PGA308_BANK__FTEST, PGA308_OTP_REG_BSEL3);
readOTPReg(PGA308_BANK__U3, PGA308_REG__ZDAC);
readOTPReg(PGA308_BANK__U3, PGA308_REG__GDAC);
readOTPReg(PGA308_BANK__U3, PGA308_REG__CFG0);
readOTPReg(PGA308_BANK__U3, PGA308_REG__CFG1);
readOTPReg(PGA308_BANK__U3, PGA308_REG__CFG2);
readOTPReg(PGA308_BANK__U3, PGA308_REG__CHKS);
}
以下是 writeOTPReg 的实现:
void kickOneWire()
{
Serial1.write(PGA308_SYNC);
Serial1.flush();
}
void writeRAMReg(uint8_t ptr, uint16_t value)
{
kickOneWire();
uint8_t buf[3];
buf[0] = PGA308_ACCESS_RAM | PGA308_ACCESS_WRITE | ptr;
buf[1] = value & 0xFF;
buf[2] = value >> 8;
Serial1.write(buf,3);
Serial1.flush();
}
void writeOTPReg(uint8_t bank_ptr, uint8_t reg_ptr, uint16_t value)
{
kickOneWire();
uint8_t buf[4];
// Transfer sync, addr and data
buf[0] = PGA308_ACCESS_OTP | PGA308_ACCESS_WRITE | (bank_ptr << 3) | reg_ptr;
buf[1] = value & 0xFF;
buf[2] = value >> 8;
Serial1.write(buf,3);
Serial1.flush();
readRAMReg(PGA308_REG__OTPS);
delay(4); //mandatory 3ms delay white OTP is being written
readRAMReg(PGA308_REG__OTPS);
}
我观察到 OTP BSY 位永远不会置位、当我读回 OTP 时、我得到的全部为0xFF。 我已通过逻辑分析仪确认我根本不写入0xFFs。
我出了什么问题? 我还附上了原理图片段供您参考。 谢谢!