找回密码
 立即注册
查看: 547|回复: 6

IIC读1个字节数据可以,读多个不行的问题

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:200
  • 最近打卡:2025-06-11 09:43:25

12

主题

58

回帖

996

积分

高级会员

积分
996
发表于 2024-7-21 22:54:27 | 显示全部楼层 |阅读模式
如题,IIC驱动采用的是官方提供的例程,用了硬件的IIC


#include "iic.h"
#include "user_mems.h"



/*
*********************************************************************************************************
*                                       硬件iic
*********************************************************************************************************
*/


void iic_init(void)
{
       
          P_SW2 = 0x90;                       //使能XFR访问,I2C选择P2.4,P2.5
    I2CCFG = 0xe0;                      //使能I2C主机模式
    I2CMSST = 0x00;
}

void Wait()
{
    while (!(I2CMSST & 0x40));
    I2CMSST &= ~0x40;
}

void Start()
{
    I2CMSCR = 0x01;                         //发送START命令
    Wait();
}

void SendData(char dat)
{
    I2CTXD = dat;                           //写数据到数据缓冲区
    I2CMSCR = 0x02;                         //发送SEND命令
    Wait();
}

void RecvACK()
{
    I2CMSCR = 0x03;                         //发送读ACK命令
    Wait();
}

char RecvData()
{
    I2CMSCR = 0x04;                         //发送RECV命令
    Wait();
    return I2CRXD;
}

void SendACK()
{
    I2CMSST = 0x00;                         //设置ACK信号
    I2CMSCR = 0x05;                         //发送ACK命令
    Wait();
}

void SendNAK()
{
    I2CMSST = 0x01;                         //设置NAK信号
    I2CMSCR = 0x05;                         //发送ACK命令
    Wait();
}

void Stop()
{
    I2CMSCR = 0x06;                         //发送STOP命令
    Wait();
}

void WriteNbyte(u8 addr, u8 *p, u8 number)  /*  WordAddress,First Data Address,Byte lenth   */
{
    Start();                                //发送起始命令
    SendData(SLAW);                         //发送设备地址+写命令
    RecvACK();
    SendData(addr);                         //发送存储地址
    RecvACK();
    do
    {
        SendData(*p++);
        RecvACK();
    }
    while(--number);
    Stop();                                 //发送停止命令
}

void ReadNbyte(u8 addr, u8 *p, u8 number)   /*  WordAddress,First Data Address,Byte lenth   */
{
    Start();                                //发送起始命令
    SendData(SLAW);                         //发送设备地址+写命令
    RecvACK();
    SendData(addr);                         //发送存储地址
    RecvACK();
    Start();                                //发送起始命令
    SendData(SLAR);                         //发送设备地址+读命令
    RecvACK();
    do
    {
        *p = RecvData();
        p++;
        if(number != 1) SendACK();          //send ACK
    }
    while(--number);
    SendNAK();                              //send no ACK       
    Stop();                                 //发送停止命令
}
/****************************/


ReadNbyte 读6个长度时返回数据不对,但是挨个读就没问题

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9128

积分

超级版主

DebugLab

积分
9128
发表于 2024-7-21 23:02:13 | 显示全部楼层
截图202407212302083416.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-06-16 00:53:18

0

主题

336

回帖

1628

积分

金牌会员

积分
1628
发表于 2024-7-21 23:15:35 | 显示全部楼层
char RecvData()返回值是char,p指向的是unsinged char,就算程序执行正确你得到的值也不是你想要的结果
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:200
  • 最近打卡:2025-06-11 09:43:25

12

主题

58

回帖

996

积分

高级会员

积分
996
发表于 2024-7-21 23:40:39 | 显示全部楼层
本帖最后由 ldc521 于 2024-7-21 23:44 编辑
xxxe*** 发表于 2024-7-21 23:15
char RecvData()返回值是char,p指向的是unsinged char,就算程序执行正确你得到的值也不是你想要的结果 ...

额 都是2进制表示8位数据为啥不是我想要的结果呢?


har test1 = -1;
unsigned char test2 = 0;
void main(void)
{
    u8 i;
        u8 write_data = 0;
        EAXSFR();                /* 扩展寄存器访问使能 */
        GPIO_config();
        Timer_config();
        I2C_config();
        UART_config();
        EA = 1;
        printf("test1 = %bd\r\n",test1);
        printf("test2 = %bd\r\n",test2);
        test2 = test1;
        printf("test2 = %bd\r\n",test2);

}


[23:43:45.548]接收←test1 = -1
                    test2 = 0
                    test2 = -1

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:200
  • 最近打卡:2025-06-11 09:43:25

12

主题

58

回帖

996

积分

高级会员

积分
996
发表于 2024-7-21 23:46:32 | 显示全部楼层
应该是IIC的硬件驱动跟我的陀螺仪芯片 通讯时序上有点不一样的地方,明天看下陀螺仪芯片的手册,接逻辑分析仪看下数据
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-06-16 00:53:18

0

主题

336

回帖

1628

积分

金牌会员

积分
1628
发表于 2024-7-22 00:50:42 | 显示全部楼层
这涉及到有符号数在内存中的存储方式了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-21 13:27:07

0

主题

1

回帖

366

积分

等待验证会员

积分
366
发表于 2024-7-22 05:31:42 | 显示全部楼层
函数参数 u8 *p 改成 char *p  试试
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 19:52 , Processed in 0.132401 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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