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个长度时返回数据不对,但是挨个读就没问题
char RecvData()返回值是char,p指向的是unsinged char,就算程序执行正确你得到的值也不是你想要的结果 本帖最后由 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
应该是IIC的硬件驱动跟我的陀螺仪芯片 通讯时序上有点不一样的地方,明天看下陀螺仪芯片的手册,接逻辑分析仪看下数据 这涉及到有符号数在内存中的存储方式了 函数参数 u8 *p 改成 char *p试试
页:
[1]