您好,
我正在尝试将I2C通信从一个F2.8069万传播到另一个F2.8069万。 我看到从属地址为0x7900。
我有一个10千欧电阻器作为上拉。 我已禁用中断和FIFO。
使用下面的代码,我发现一个字节的数据传输正常,但使用逻辑分析器时,我无法看到SCL线路上的任何时钟。 数据传输结束后,SCL时钟是否会停止?
该代码对新手来说是否合适?
这是我的代码-
#include "DSP28x_Project.h"
#include <stdint.h>
UINT16_t Readi2c();
void Writei2c();
void Initi2c();
void Initial2c (void){
EALLOW;
// gpioCtrlRegs.GPBPUD.bit.GPIO32 = 0x0000; //I正在使用外部上拉电阻器
// GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0x0000;
gpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 0x0003;
gpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 0x0003;
gpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0x0001;
gpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0x0001;
EDIS;
I2caRegs.I2CMDR.All = 0x0000; //在设置预校准之前保持I2C复位
I2caRegs.I2CSAR = 0x7900; // F2.8069万的地址
I2caRegs.I2CPsc.all = 0x0008; //表示400kHz
I2caRegs.I2CCLKL = 20;
I2caRegs.I2CCLKH = 10;
I2caRegs.I2CIER .all = 0x0000; //禁用所有中断
// I2caRegs.I2CFFTX.ALL = 0x6000;//启用FIFO模式和TXFIFO
// I2caRegs.I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT,
I2caRegs.I2CMDR.ALL = 0x0020; // 1:从重置中取出I2C
// 0:暂停时停止I2C
}
UINT16_t Readi2c()
{
uINT16_t 临时数据;
I2caRegs.I2CSAR = 0x7900;
I2caRegs.I2CCNT = 0x0001;
I2caRegs.I2CMDR.All = 0x2020; //在接收从属模式下启动
while (!I2caRegs.I2CSTR.bit.RRDY);
I2caRegs.I2CCNT = 0x0001;
I2caRegs.I2CMDR.All = 0x2C20; //主接收。
I2caRegs.I2CMDR.ALL = 0x2820; // 其他F2.8069万 (从属)具有0x2820作为从属模式接收
tempddata = I2caRegs.I2CDRR;
return(tempda);
}
void Writei2c()
{
// I2caRegs.I2CMDR.All = 0x2620;//发送启动条件
I2caRegs.I2CSAR = 0x7900;
I2caRegs.I2CCNT = 0x0001;
I2caRegs.I2CDXR = 0x05; //在总线上写入一个字节
I2caRegs.I2CMDR.ALL = 0x2E20; //发送停止位并设置为主发送器
while (!I2caRegs.I2CSTR.Bit.SCD);
I2caRegs.I2CSTR.Bit.SCD = 1;
}
void main()
{
uINT16_t记录数据;
InitSysCtrl();//I2C 时钟在此函数中初始化
初始2c();
Writei2c();
recvdata = Readi2c();//从F2.8069万读取F2.8069万主控数据的线路
同时(1)
{
}
}