写一个基于F28335的IIC程序,并详细解读
时间: 2024-03-11 15:47:25 浏览: 17
F28335是德州仪器(TI)公司生产的一款32位浮点数控制器,它集成了多个模块,包括IIC模块。IIC通信协议是一种串行通信协议,由飞利浦公司推出。它通过两条线(SDA和SCL)实现数据传输,可以连接多个设备,因此被广泛应用于各种电子设备之间的通信。
下面是基于F28335的IIC程序的代码:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define I2C_SLAVE_ADDR 0x50
void InitI2CGpio(void);
void InitI2C(void);
void I2CWriteByte(unsigned char slaveAddr, unsigned char regAddr, unsigned char data);
unsigned char I2CReadByte(unsigned char slaveAddr, unsigned char regAddr);
void InitI2CGpio(void)
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1;
GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 3;
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1;
GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 3;
EDIS;
}
void InitI2C(void)
{
EALLOW;
CpuSysRegs.PCLKCR9.bit.I2C_A = 1;
I2caRegs.I2CMDR.bit.IRS = 0; // 先复位I2C控制器
I2caRegs.I2CPSC.all = 7; // 分频系数为8
I2caRegs.I2CSAR.bit.SAR = I2C_SLAVE_ADDR; // 设置从设备地址为0x50
I2caRegs.I2CMDR.bit.ORM = 1; // 使能接收模式
I2caRegs.I2CMDR.bit.XA = 1; // 使能扩展地址
I2caRegs.I2CMDR.bit.RM = 1; // 使能重复开始
I2caRegs.I2CMDR.bit.TRX = 1; // 发送模式
I2caRegs.I2CMDR.bit.STP = 1; // 发送停止位
I2caRegs.I2CMDR.bit.IRS = 1; // 使能I2C控制器
EDIS;
}
void I2CWriteByte(unsigned char slaveAddr, unsigned char regAddr, unsigned char data)
{
Uint16 i;
while (I2caRegs.I2CSTR.bit.BB); // 等待总线空闲
I2caRegs.I2CCNT = 2; // 发送2个字节
I2caRegs.I2CDXR = slaveAddr << 1; // 发送从设备地址
I2caRegs.I2CDXR = regAddr; // 发送寄存器地址
I2caRegs.I2CMDR.bit.STP = 0; // 禁止发送停止位,准备发送数据
I2caRegs.I2CMDR.bit.STT = 1; // 发送起始位
while (!I2caRegs.I2CSTR.bit.ARDY); // 等待发送完成
for (i = 0; i < 10000; i++);
I2caRegs.I2CDXR = data; // 发送数据
I2caRegs.I2CMDR.bit.STP = 1; // 发送停止位
while (I2caRegs.I2CMDR.bit.STP); // 等待发送完成
}
unsigned char I2CReadByte(unsigned char slaveAddr, unsigned char regAddr)
{
Uint16 i;
while (I2caRegs.I2CSTR.bit.BB); // 等待总线空闲
I2caRegs.I2CCNT = 2; // 发送2个字节
I2caRegs.I2CDXR = slaveAddr << 1; // 发送从设备地址
I2caRegs.I2CDXR = regAddr; // 发送寄存器地址
I2caRegs.I2CMDR.bit.STP = 0; // 禁止发送停止位,准备读取数据
I2caRegs.I2CMDR.bit.STT = 1; // 发送起始位
while (!I2caRegs.I2CSTR.bit.ARDY); // 等待发送完成
I2caRegs.I2CCNT = 1; // 发送1个字节
I2caRegs.I2CDXR = (slaveAddr << 1) | 0x01; // 发送从设备地址和读取标志
I2caRegs.I2CMDR.bit.STP = 0; // 禁止发送停止位,准备读取数据
I2caRegs.I2CMDR.bit.STT = 1; // 发送起始位
while (!I2caRegs.I2CSTR.bit.RRDY); // 等待数据接收完成
for (i = 0; i < 10000; i++);
I2caRegs.I2CMDR.bit.STP = 1; // 发送停止位
while (I2caRegs.I2CMDR.bit.STP); // 等待发送完成
return I2caRegs.I2CDRR; // 返回读取的数据
}
```
在程序中,首先需要初始化I2C相关的GPIO口,然后再初始化I2C控制器。在写入数据时,调用I2CWriteByte函数,传入从设备地址、寄存器地址和要写入的数据即可完成数据写入操作,其中需要注意的是,写入数据时需要先发送从设备地址和寄存器地址,再发送要写入的数据。在读取数据时,调用I2CReadByte函数,传入从设备地址和寄存器地址即可完成数据读取操作,其中需要注意的是,读取数据时需要先发送从设备地址和寄存器地址,再发送从设备地址和读取标志,最后再读取数据。
需要注意的是,上述代码只是一个基本的I2C程序框架,具体的实现细节需要根据所连接设备的要求进行调整。