|
本帖最后由 suweisuwei 于 2023-8-2 13:47 编辑
模拟io口可以正常读取数据 但是还是想使用一下FL库中的IIC读取相关的函数void IIC_R(uint8_t MemAddress, uint8_t *res) { HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, MemAddress, I2C_MEMADD_SIZE_8BIT, res, 1, 0xff);}void IIC_W(uint8_t MemAddress, uint8_t *data) { printf("%s", data); HAL_I2C_Mem_Write(ADXL345_IIC_ADD, ADXL345_W_ADD, MemAddress, I2C_MEMADD_SIZE_8BIT, data, 1, 0xff);}void ADXL345_Init() { uint8_t device_id; IIC_R(DEVICE_ID, &device_id); while (1) { if (device_id == 0xE5) { break; } debugPrintf("ADXL345 ERROR"); IIC_R(DEVICE_ID, &device_id); } uint8_t val; val = 0x2B; IIC_W(DATA_FORMAT, &val); //�͵�ƽ�ж����,13λȫ�ֱ���,��������Ҷ���,16g���� val = 0x0A; IIC_W(BW_RATE, &val); //��������ٶ�Ϊ100Hz val = 0x28; IIC_W(POWER_CTL, &val); //����ʹ��,����ģʽ val = 0x00; IIC_W(INT_ENABLE, &val); //��ʹ���ж� IIC_W(OFSX, &val); IIC_W(OFSY, &val); IIC_W(OFSZ, &val); debugPrintf("ADXL345 INIT SUCCESS");}/** * ��ȡ���ٶ�ֵ debugģʽ�� �������������ʾ 1/1000���������ٶ� * @param structAdxl345 */void Get_Acc(ADXL345 structAdxl345) { IIC_R(DATA_X0, &structAdxl345.X0); IIC_R(DATA_X1, &structAdxl345.X1); IIC_R(DATA_Y0, &structAdxl345.Y0); IIC_R(DATA_Y1, &structAdxl345.Y1); IIC_R(DATA_Z0, &structAdxl345.Z0); IIC_R(DATA_Z1, &structAdxl345.Z1); structAdxl345.acc_x = (short) (((uint16_t) structAdxl345.X1 << 8) + structAdxl345.X0); structAdxl345.acc_y = (short) (((uint16_t) structAdxl345.Y1 << 8) + structAdxl345.Y0); structAdxl345.acc_z = (short) (((uint16_t) structAdxl345.Z1 << 8) + structAdxl345.Z0); debugPrintf("Get 1/1000 g is x:%.2f ,y:%.2f ,z:%.2f\r\n", structAdxl345.acc_x * 3.9, structAdxl345.acc_y * 3.9, structAdxl345.acc_z * 3.9);}/** * ��ȡx,y,z�����ϵļ��ٶ� * @param x * @param y * @param z */void ADXL345_RD_XYZ(short *x, short *y, short *z) { uint8_t buf[6]; HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_X0, I2C_MEMADD_SIZE_8BIT, &buf[0], 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_X1, I2C_MEMADD_SIZE_8BIT, &buf[1], 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Y0, I2C_MEMADD_SIZE_8BIT, &buf[2], 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Y1, I2C_MEMADD_SIZE_8BIT, &buf[3], 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Z0, I2C_MEMADD_SIZE_8BIT, &buf[4], 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Z1, I2C_MEMADD_SIZE_8BIT, &buf[5], 1, 0xFF); *x = (short) (((uint16_t) buf[1] << 8) + buf[0]); //DATA_X1Ϊ��λ��Ч�ֽ� *y = (short) (((uint16_t) buf[3] << 8) + buf[2]); //DATA_Y1Ϊ��λ��Ч�ֽ� *z = (short) (((uint16_t) buf[5] << 8) + buf[4]); //DATA_Z1Ϊ��λ��Ч�ֽ�}上面的程序是在STM32上面 HAL库封装的函数比较全面 我可以直接使用上面的函数进行读取但是复旦微中我仅仅是使用FL读取了一个ID就花了这么多代码 然后这好像在示波器上的STOP信号还是会应答为ERROR 不知道是什么意思 希望给我提示下 FL 对于 这个函数如何封装成HAL库中的HAL_I2C_Mem_Read和HAL_I2C_Mem_Write函数下面是我使用FL读取的ADXL345的ID int main(void){ /* Initialize FL Driver Library */ FL_Init(); /* Configure the system clock */ MF_Clock_Init(); /* Initialize all configured peripherals */ MF_Config_Init(); uint32_t res=0; while(1) { FL_I2C_Master_EnableI2CStart(I2C); while(!FL_I2C_Master_IsActiveFlag_Start(I2C)); FL_I2C_Master_WriteTXBuff(I2C,0xA6); while(!FL_I2C_Master_IsActiveFlag_TXComplete(I2C)); FL_I2C_Master_ClearFlag_TXComplete(I2C); FL_I2C_Master_SetRespond(I2C, FL_I2C_MASTER_RESPOND_ACK); FL_I2C_Master_WriteTXBuff(I2C,0x00); while(!FL_I2C_Master_IsActiveFlag_TXComplete(I2C)); FL_I2C_Master_ClearFlag_TXComplete(I2C); FL_I2C_Master_SetRespond(I2C, FL_I2C_MASTER_RESPOND_ACK); FL_I2C_Master_EnableI2CRestart(I2C); while(!FL_I2C_Master_IsActiveFlag_Start(I2C)); FL_I2C_Master_WriteTXBuff(I2C,0xA7); while(!FL_I2C_Master_IsActiveFlag_TXComplete(I2C)); FL_I2C_Master_ClearFlag_TXComplete(I2C); FL_I2C_Master_SetRespond(I2C, FL_I2C_MASTER_RESPOND_ACK); FL_I2C_Master_EnableRX(I2C); while(!FL_I2C_Master_IsActiveFlag_RXComplete(I2C)); FL_I2C_Master_ClearFlag_RXComplete(I2C); res = FL_I2C_Master_ReadRXBuff(I2C); FL_I2C_Master_DisableRX(I2C); FL_I2C_Master_SetRespond(I2C, FL_I2C_MASTER_RESPOND_NACK); while(!FL_I2C_Master_IsActiveFlag_NACK); FL_I2C_Master_ClearFlag_NACK; //FL_DelayMs(200); FL_I2C_Master_EnableI2CStop(I2C); while(!FL_I2C_Master_IsActiveFlag_Stop(I2C)); res = res; FL_DelayMs(1000); }}还请大佬指点下哈
|
|