查看: 968|回复: 4

FL IIC 使用过程 出现问题

[复制链接]

2

主题

7

帖子

103

积分

中级工程师

Rank: 2

积分
103
发表于 2023-8-2 13:44:31 | 显示全部楼层 |阅读模式
本帖最后由 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);    }}还请大佬指点下哈

2

2

1

1

07_demo_fm_iic_adxl345.rar

9.97 MB, 下载次数: 139

3

回复

使用道具 举报

2

主题

7

帖子

103

积分

中级工程师

Rank: 2

积分
103
 楼主| 发表于 2023-8-2 13:49:59 | 显示全部楼层
这个是STM32相关的IIC封装好的函数 可以告诉我我该如何书写对应的FLIIC相关的函数

Snipaste_2023-08-02_13-48-40.png
回复

使用道具 举报

151

主题

845

帖子

4405

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4405
发表于 2023-8-8 08:39:13 | 显示全部楼层
suweisuwei 发表于 2023-8-2 13:49
这个是STM32相关的IIC封装好的函数 可以告诉我我该如何书写对应的FLIIC相关的函数

...

可以参考 官方的 I2C读写EEPROM例程,里面的一些发送bit,起始结束位,发送接收字节的函数都是现成的可以用的。看hal的那张图,按照函数的功能进行封装就可以了,感觉没什么难看懂的。I2C就是看波形,没啥难度。波形调试正确,就能通信上,波形对,还通信不上,就放慢波特率。可以用示波器或者逻辑分析仪监控波形。
回复

使用道具 举报

2

主题

7

帖子

103

积分

中级工程师

Rank: 2

积分
103
 楼主| 发表于 2023-8-8 09:25:19 | 显示全部楼层
顾博文 发表于 2023-8-8 08:39
可以参考 官方的 I2C读写EEPROM例程,里面的一些发送bit,起始结束位,发送接收字节的函数都是现成的可以 ...

好的顾哥
回复

使用道具 举报

1

主题

2

帖子

85

积分

中级工程师

Rank: 2

积分
85
发表于 2024-1-18 09:57:12 | 显示全部楼层
同问,NACK的中断产生的时间是多长,有没有延时,我有一个项目,发送从机地址总是可以有ACK,但是从机寄存器地址总是因为NACK而退出,但实际上是有ACK的,在13uS左右就有ACK
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表