以下是小弟改的F28335的I2C模块读写函数,可是程序还是读不出数,希望大家看看有什么不妥之处
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
/*****************************************************************************
名称:WriteData;
功能:I2C写多字节函数;
形参:*Wdata(写入的数据)、Address(写入数据的目标地址)、bytenumber(数据字节数);
******************************************************************************/
Uint16 WriteData(Uint16 *Wdata, Uint16 Address, Uint16 bytenumber)
{
Uint16 i;
if(I2caRegs.I2CMDR.bit.STP == 1)
{
return I2C_STP_NOT_READY_ERROR;
}
if(I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
} //前两句判断数据总线是否空闲
I2caRegs.I2CSAR = 0x68; //从机地址
I2caRegs.I2CCNT = bytenumber+1; //I2C模块传输数据个数:起始信号、器件地址、数据。
//但是由于器件地址紧随起始信号送到数据总线,
//因此实际需要传输的数据是 数据字节数+1,1为起始信号
I2caRegs.I2CDXR = Address; //写入数据的目标地址,先传输数据地址再传输数据
I2caRegs.I2CMDR.all = 0x6E20; //对I2C模块进行配置:1、主机;2、发送数据;3、在结束后产生停止位
//4、使能I2C模块;5、启动开始信号发送数据
for (i=0;i<bytenumber;i++)
{
I2caRegs.I2CDXR = *Wdata;
Wdata++;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
} //数据压入数据缓存寄存器I2CDXR
return I2C_SUCCESS;
}
/*****************************************************************************
名称:ReadData;
功能:I2C读多字节函数;
形参:*data(读入的数据)、Address(读入数据的源地址)、bytenumber(数据字节数);
******************************************************************************/
Uint16 ReadData(Uint16 *data, Uint16 address, Uint16 bytenumber)
{
Uint16 i,Temp;
if (I2caRegs.I2CMDR.bit.STP == 1)
{
return I2C_STP_NOT_READY_ERROR;
}
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
} //前两句判断数据总线是否空闲
I2caRegs.I2CSAR = 0x68; //从机地址
I2caRegs.I2CCNT = 1; //开始时需要传输的只是一个内存地址,
//所以数据计数寄存器I2CCNT设置为1。
I2caRegs.I2CDXR = address; //传输源地址
I2caRegs.I2CMDR.all = 0x6620; //对I2C模块进行配置:1、主机;2、发送数据;3、在结束后不产生停止位
//4、使能I2C模块;5、启动开始信号发送数据
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
DELAY_US(50);
I2caRegs.I2CCNT = bytenumber; //I2C模块传输数据个数:1(数据)
I2caRegs.I2CMDR.all = 0x6C20; //对I2C模块进行配置:1、开始位;2、停止位;3、主机;
//4、接收器状态;5、启动开始信号发送数据
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
for(i=0;i<bytenumber;i++)
{
Temp = I2caRegs.I2CDRR;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
*data = Temp;
data++; //数据压入数据缓存寄存器I2CDRR
}
return I2C_SUCCESS;
}
|