DSP6748 IIC读写使用

本文详细介绍了C6748 DSP中IIC模块的地址模式和通信模式,包括7bit、10bit和free地址格式,以及NOREAPTE和REAPTE通信模式。此外,还解析了IIC函数配置,如PINMUX4寄存器设置、中断初始化和IIC初始化过程,包括I2CMasterDisable、I2CMasterInitExpClk和I2CMasterSlaveAddrSet等函数的使用。最后,简要提及了DSP IIC的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,DSP中IIC模块框图:

1. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
2. 启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
3. 停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
4. 数据传送
SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为低电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。
5. 应答信号ACK
I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
6. 无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
a. 一般表示接收器未成功接收数据字节;
b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。</
以下是DSP28335使用IIC读写M24M02的多个数据的代码示例: 首先需要初始化IIC,如下所示: ```c void InitI2C(void) { // 设置I2C引脚 EALLOW; GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1; EDIS; // 初始化I2C I2caRegs.I2CMDR.bit.IRS = 0; // I2C复位 I2caRegs.I2CPSC.all = 6; // 分频器值为6,时钟频率为150kHz I2caRegs.I2CSAR = M24M02_ADDR; // 设置从设备地址 I2caRegs.I2CMDR.bit.IRS = 1; // 退出I2C复位 } ``` 然后可以定义一个函数来写入多个数据: ```c void WriteMultipleBytes(uint16_t addr, uint16_t num, uint8_t *data) { uint16_t i; // 发送起始信号 I2caRegs.I2CMDR.bit.STP = 1; I2caRegs.I2CMDR.bit.MST = 1; I2caRegs.I2CDXR = (M24M02_ADDR << 1) & 0xFE; I2caRegs.I2CMDR.bit.TRX = 1; I2caRegs.I2CMDR.bit.STT = 1; while (I2caRegs.I2CSTR.bit.ARDY == 0); // 发送地址 I2caRegs.I2CDXR = (addr >> 8) & 0xFF; while (I2caRegs.I2CSTR.bit.ARDY == 0); I2caRegs.I2CDXR = addr & 0xFF; while (I2caRegs.I2CSTR.bit.ARDY == 0); // 发送数据 for (i = 0; i < num; i++) { I2caRegs.I2CDXR = data[i]; while (I2caRegs.I2CSTR.bit.ARDY == 0); } // 发送停止信号 I2caRegs.I2CMDR.bit.STP = 1; while (I2caRegs.I2CSTR.bit.ARDY == 0); } ``` 然后可以定义一个函数来读取多个数据: ```c void ReadMultipleBytes(uint16_t addr, uint16_t num, uint8_t *data) { uint16_t i; // 发送起始信号 I2caRegs.I2CMDR.bit.STP = 1; I2caRegs.I2CMDR.bit.MST = 1; I2caRegs.I2CDXR = (M24M02_ADDR << 1) & 0xFE; I2caRegs.I2CMDR.bit.TRX = 1; I2caRegs.I2CMDR.bit.STT = 1; while (I2caRegs.I2CSTR.bit.ARDY == 0); // 发送地址 I2caRegs.I2CDXR = (addr >> 8) & 0xFF; while (I2caRegs.I2CSTR.bit.ARDY == 0); I2caRegs.I2CDXR = addr & 0xFF; while (I2caRegs.I2CSTR.bit.ARDY == 0); // 发送重复起始信号 I2caRegs.I2CMDR.bit.STP = 1; I2caRegs.I2CMDR.bit.MST = 1; I2caRegs.I2CDXR = (M24M02_ADDR << 1) | 0x01; I2caRegs.I2CMDR.bit.TRX = 0; I2caRegs.I2CMDR.bit.STT = 1; while (I2caRegs.I2CSTR.bit.ARDY == 0); // 读取数据 for (i = 0; i < num; i++) { while (I2caRegs.I2CSTR.bit.RRDY == 0); data[i] = I2caRegs.I2CDRR; } // 发送停止信号 I2caRegs.I2CMDR.bit.STP = 1; while (I2caRegs.I2CSTR.bit.ARDY == 0); } ``` 使用上述函数可以实现对M24M02的多个数据的读写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒听雪落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值