FL IIC 使用过程 出现问题
本帖最后由 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; HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_X0, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_X1, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Y0, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Y1, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Z0, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); HAL_I2C_Mem_Read(ADXL345_IIC_ADD, ADXL345_R_ADD, DATA_Z1, I2C_MEMADD_SIZE_8BIT, &buf, 1, 0xFF); *x = (short) (((uint16_t) buf << 8) + buf); //DATA_X1Ϊ��λ��Ч�ֽ� *y = (short) (((uint16_t) buf << 8) + buf); //DATA_Y1Ϊ��λ��Ч�ֽ� *z = (short) (((uint16_t) buf << 8) + buf); //DATA_Z1Ϊ��λ��Ч�ֽ�}上面的程序是在STM32上面 HAL库封装的函数比较全面 我可以直接使用上面的函数进行读取但是复旦微中我仅仅是使用FL读取了一个ID就花了这么多代码 然后这好像在示波器上的STOP信号还是会应答为ERROR 不知道是什么意思 希望给我提示下 FL 对于 这个函数如何封装成HAL库中的HAL_I2C_Mem_Read和HAL_I2C_Mem_Write函数下面是我使用FL读取的ADXL345的IDint 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); }}还请大佬指点下哈
这个是STM32相关的IIC封装好的函数 可以告诉我我该如何书写对应的FLIIC相关的函数
suweisuwei 发表于 2023-8-2 13:49
这个是STM32相关的IIC封装好的函数 可以告诉我我该如何书写对应的FLIIC相关的函数
...
可以参考 官方的 I2C读写EEPROM例程,里面的一些发送bit,起始结束位,发送接收字节的函数都是现成的可以用的。看hal的那张图,按照函数的功能进行封装就可以了,感觉没什么难看懂的。I2C就是看波形,没啥难度。波形调试正确,就能通信上,波形对,还通信不上,就放慢波特率。可以用示波器或者逻辑分析仪监控波形。 顾博文 发表于 2023-8-8 08:39
可以参考 官方的 I2C读写EEPROM例程,里面的一些发送bit,起始结束位,发送接收字节的函数都是现成的可以 ...
好的顾哥 同问,NACK的中断产生的时间是多长,有没有延时,我有一个项目,发送从机地址总是可以有ACK,但是从机寄存器地址总是因为NACK而退出,但实际上是有ACK的,在13uS左右就有ACK
页:
[1]