主题中讨论的其他器件:HDC1010、 C2000WARE
大家好、我使用 F28069从传感器 HDC1010读取数据。
我可以读取 ManufacturerID 和 DeviceID 的正确数据。 但我无法获取传感器的正确数据。
读取 制造商 ID:确定
2.配置传感器:好的
从寄存器0x00读取温度:失败、但逻辑分析仪捕获了正确的数据、如下所示、但数据缓冲区读取错误。
再次从寄存器读取温度:获取最后一次的数据、我真的不知道原因。
5. I2C 初始化代码
void I2CA_Init (void) { //初始化 I2C I2caRegs.I2CMDR.all = 0x0000; I2caRegs.I2CSAR = 0; //从地址 I2caRegs.I2CPSC.all = 8; //预分频器-模块时需要7-12MHz 的时钟 I2caRegs.I2CCLKL = 10; //注:必须为非零 I2caRegs.I2CCLKH=5; //注:必须为非零 //I2caRegs.I2CIER。all = 0x24; //启用 SCD 和 ARDY 中断0010 0100 I2caRegs.I2CIER.bit.AAS = 0; //寻址为从器件中断使能位 I2caRegs.I2CIER.bit.SCD = 1; //检测到停止条件中断使能位 I2caRegs.I2CIER.bit.XRDY = 0; //发送数据就绪中断使能位 I2caRegs.I2CIER.bit.XRDY = 0; //接收数据就绪中断使能位 I2caRegs.I2CIER.bit.ARDY = 1; //寄存器访问就绪中断使能位 I2caRegs.I2CIER.bit.nack = 0; //无确认中断使能位 I2caRegs.I2CIER.bit.ARBL = 0; //仲裁丢失中断使能位 //I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位状态,挂起 I2caRegs.I2CMDR.bit.NACKMOD = 0时停止 I2C; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 0; //挂起 I2caRegs.I2CMDR.bit.STT = 0时停止 I2C; //起始条件位 I2caRegs.I2CMDR.bit.STP= 0; //停止条件位 I2caRegs.I2CMDR.bit.MST = 0; //从机模式 I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; // I2C 模块被使能 I2caRegs.I2CMDR.bit.STB=0; // I2C 模块不在起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //自由数据格式模式被禁用 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 // I2caRegs.I2CFFTX.all = 0x6000; //启用 FIFO 模式和 TXFIFO I2caRegs.I2CFFTX.bit.I2CFFEN = 1; //启用 I2C FIFO 模式 I2caRegs.I2CFFTX.bit.TXFFRST=1; //启用发送 FIFO 操作 I2caRegs.I2CFFTX.bit.TXFFINTCLR = 0; //清除 TXFFINT 标志 I2caRegs.I2CFFTX.bit.TXFFIENA=0; 当 I2caRegs.I2CFFTX.bit.TXFFIL = 0时、// TXFFINT 标志不会生成中断; //发送 FIFO 中断级别 // I2caRegs.I2CFFRX.ALL = 0x2040; //启用 RXFIFO、清除 RXFFINT I2caRegs.I2CFFRX.bit.RXFFRST = 1; //启用接收 FIFO 操作 I2caRegs.I2CFFRX.bit.RXFFINTCLR = 1; //清除 RXFFINT 标志 I2caRegs.I2CFFRX.bit.RXFFIENA=0; 当 I2caRegs.I2CFFRX.bit.RXFFIL = 0时、// RXFFINT 标志会生成一个中断; //接收 FIFO 中断级别 返回; }
读取传感器的功能
void HDC_GetSensor (uint16 addr、uint16 reg、uint16 ReadCount、uint8 *缓冲区) { uint16 i; I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C //确保 I2C 不忙且已停止 while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环 I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位) while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环 I2caRegs.I2CSAR = addr; // I2C 从地址 I2caRegs.I2CMDR.ALL = 0x2E20; //开始、无停止位、主器件、TX、复位 I2C 00100110 I2caRegs.I2CCNT = 1; //假设寄存器地址为一个字节 I2caRegs.I2CDXR =寄存器; //传感器的寄存器地址(1个字节) //while (!I2caRegs.I2CSTR.bit.ARDY); //准备好了吗? while (HDC_DRDY_READ ()!= HDC_Ready); I2caRegs.I2CMDR.ALL = 0x2C20; //开始、CNT = 0时的停止位、主器件、Rx、复位 I2C 00101100 I2caRegs.I2CCNT = ReadCount; //只读取一个字节数据 if (I2caRegs.I2CSTR.bit.nack = 1) { I2caRegs.I2CSTR.All = I2C_CLR_Nack_bit;// 0x0002 } I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位 while (!I2cRegs.I2CSTR.bit.SCD); //是否检测到停止位? 对于(I = 0;I < ReadCount;I++) { Buffer[i]= I2caRegs.I2CDRR; //读取一个字节数据 } }
e2e.ti.com/.../F28069_5F00_HDC1010_5F00_2.rar
感谢您的帮助!
)
-Di


















