ldc521 发表于 2024-7-21 22:54:27

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

如题,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个长度时返回数据不对,但是挨个读就没问题

DebugLab 发表于 2024-7-21 23:02:13


xxxevery 发表于 2024-7-21 23:15:35

char RecvData()返回值是char,p指向的是unsinged char,就算程序执行正确你得到的值也不是你想要的结果

ldc521 发表于 2024-7-21 23:40:39

本帖最后由 ldc521 于 2024-7-21 23:44 编辑

xxxevery 发表于 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);

}


接收←test1 = -1
                  test2 = 0
                  test2 = -1

ldc521 发表于 2024-7-21 23:46:32

应该是IIC的硬件驱动跟我的陀螺仪芯片 通讯时序上有点不一样的地方,明天看下陀螺仪芯片的手册,接逻辑分析仪看下数据

xxxevery 发表于 2024-7-22 00:50:42

这涉及到有符号数在内存中的存储方式了

hy47566398 发表于 2024-7-22 05:31:42

函数参数 u8 *p 改成 char *p试试
页: [1]
查看完整版本: IIC读1个字节数据可以,读多个不行的问题