工具/软件:Code Composer Studio
大家好、我正在尝试在两个 Piccolo TMS320F28035 I2C 通信之间进行 I2C 通信。 我被困在了从机侧、该文档解释不多。 我很感谢你们的帮助。我很确定我做了一些错误的事情,但我不知道是什么。
P.S. :我现在不使用诸如轮询 BB、XRDY、RRDY 或 NACK 位之类的中断,只是为了使其保持简单。
以下是我的代码:
########## 主代码(只写)##############################
#define I2C_SLAVE_ADDR 0x0055
void main (void)
{
InitSysCtrl();
InitI2CGpio();\
bool 标志= true;
I2CA_Init_master ();
for (;;)
{
while (GpioDataRegs.GPBDAT.bit.GPIO44 ==0 &&标志)
{
GREENLED_ON;
I2CA_WriteData();
GREENLED_OFF;
flag = false;
//delay_US (1000000);
}
}
void I2CA_Init_master (void)
{
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; //从器件地址-
I2caRegs.I2CPSC.all = 6; //预分频器-模块时需要7-12MHz
I2caRegs.I2CCLKL = 10; //注意:必须为非零
I2caRegs.I2CCLKH = 5; //注意:必须为非零
I2caRegs.I2CIER.ALL = 0;
I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位
I2caRegs.I2CFFTX.ALL = 0x6000; //启用 FIFO 模式和 TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040; //启用 RXFIFO、清除 RXFFINT、
DELAY_US (10);
返回;
}
void I2CA_WriteData (void){
uint16 i;
// while (I2caRegs.I2CMDR.bit.STP = 1)
// {
// };
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; //从地址寄存器
I2caRegs.I2CCNT = I2C_NUMBYTES; //数据计数为4字节
I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式并复位 TX FIFO
I2caRegs.I2CDXR = 0xf0;
I2caRegs.I2CMDR.bit.TRX = 1;
I2caRegs.I2CMDR.bit.MST = 1;
I2caRegs.I2CMDR.bit.FREE = 1;
I2caRegs.I2CMDR.bit.STP= 1;//创建一个停止条件将释放总线、从而使 BB = 0。
I2caRegs.I2CMDR.bit.STT = 1;//一旦启动起始位、BB = 1再次变为繁忙状态。
返回;
}
############################ 从机代码(只读)########################
void main (void){
InitSysCtrl();
InitI2CGpio();
I2CASlave_init();
DELAY_US (1000000);
for (;;)
{
I2CA_ReceiveData();
}
}
void I2CASlave_init (void)
{
I2caRegs.I2COAR = I2C_SLAVE_ADDR; //从地址
I2caRegs.I2CPSC.all = 6; //预分频器-模块时需要7-12MHz
I2caRegs.I2CCLKL = 10; //注意:必须为非零
I2caRegs.I2CCLKH = 5; //注意:必须为非零
I2caRegs.I2CIER.ALL = 0x00; //启用 SCD、XRDY、RRDY、ARDY、 NACK 中断...抱歉、不启用任何内容
I2caRegs.I2CMDR.bit.MST = 0;//进入从机模式
I2caRegs.I2CMDR.bit.TRX = 0; //接收模式
I2caRegs.I2CMDR.bit.FREE = 1 ;//在自由模式下运行,将它设置为零,当数据被接收时将停止。l
I2caRegs.I2CMDR.ALL = 0x0020; //启用 IRS
// I2caRegs.I2CFFTX.ALL = 0x6000; //启用 FIFO 模式和 TXFIFO
// I2caRegs.I2CFFRX.ALL = 0x2040; //启用 RXFIFO、清除 RXFFINT、
返回;
}
空 I2CA_ReceiveData (空)
{
I2caRegs.I2COAR = I2C_SLAVE_ADDR; //从地址- EEPROM 控制代码
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; //从地址寄存器
I2caRegs.I2CCNT = 1;//接收计数到4个字节
//while (I2cRegs.I2CSTR.bit.RRDY = 0){};
Receive_Data[0]= I2caRegs.I2CDRR;
返回;
}