工具/软件:Code Composer Studio
大家好、
我正在尝试从磁传感器(PN:AM4096)获取数据、并且遇到了问题。 代码在同一总线上与温度传感器配合使用良好。 作为一种方式、我在第一次获得有效数据、但当我第二次尝试时、代码会挂起、以在 read_Bytes 函数中查找 I2caRegs.I2CMDR.bit.STT 标志以进行清除。
UINT16 AM4096class::GetAbsoluteAngle (void) { uint8数据[2]; int16结果= I2C_Success; AM4096class::SetRegisterAddress (32); 结果= I2C.Read_Bytes ((AM4096_address_code |(AM4096class::Address))、sizeof (data)、data); AM4096class::data_union.data_Registers.data_ADDR_33.all = data[1]<<8+data[0]; 返回结果; } uint16 I2Cclass::read_Bytes (uint16 slave_address、uint16 count、uint8 *out) { uint16 i、ret; GpioDataRegs.GPADAT.bit.GPIO21=0; I2Cclass::start (slave_address); GpioDataRegs.GPADAT.bit.GPIO21=1; //发出重复启动 I2caRegs.I2CMDR.bit.STT = 1; //等待重复开始到结束 I2Cclass::timeout=0; while (I2caRegs.I2CMDR.bit.STT!= 0) { I2Cclass::I2Cclass::timeout++; if (I2Cclass::I2Cclass::timeout>timeout_limit) { 返回 I2C_ERROR; } } //非重复模式 I2caRegs.I2CMDR.bit.RM = 0; //设置数据计数 I2caRegs.I2CCNT =计数; //在数据计数器递减到0时生成停止条件 I2caRegs.I2CMDR.bit.STP= 1; //接收器模式 I2caRegs.I2CMDR.bit.TRX = 0; 对于(i = 0;i < count;+i) { //等待数据接收寄存器准备好读取 I2Cclass::timeout=0; while (I2cRegs.I2CSTR.bit.RRDY!= 1) { I2Cclass::timeout++; if (I2Cclass::timeout>timeout_limit) 返回 I2C_ERROR; } OUT[i]= I2caRegs.I2CDRR; } 返回 I2C_SUCCESS; } UINT16 I2Cclass::start (UINT16 SLAVE_ADDRESS) { //加载从器件地址 I2caRegs.I2CSAR =从器件地址; //等待停止条件 I2Cclass::timeout=0; while (I2caRegs.I2CMDR.bit.STP!= 0) { I2Cclass::timeout++; if (I2Cclass::timeout>timeout_limit) 返回 I2C_ERROR; } //主控模式 I2caRegs.I2CMDR.bit.MST = 1; //生成起始条件 I2caRegs.I2CMDR.bit.STT = 1; 返回 I2C_Success ;}
下面的图片是第一个请求。 它返回正确的值。
第二幅图显示了 I2C 总线挂起。 它能够发送从器件和寄存器地址。
此图像是从 Arduino 运行传感器时的图像。 它每次都能正常工作。
有人能不能就此发出一些光? 谢谢!




