This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:28383 I2C minterface

Guru**** 2553260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1223714/tms320f28388d-28383-i2c-minterface

器件型号:TMS320F28388D

大家好!  

时间处于28383、以尝试使 I2C 总线正常运行。 我从这个示例开始、这个示例只输出在每个中断中递增的字节。 环回示例。  

我对其进行了修改、以尝试为总线上的几个 I2C 芯片发送初始化数据。  

在我的代码中、我已经将 I2CA 外设设置为主发送器并启用 FIFO。 我将0x3B 的从地址载入到从器件地址、将3个消息字节载入到 FIFO。 然后、尝试通过设置"CMDR"寄存器中的"开始条件"位来启动方。 奖励的只是一个测量值为 IF 0x70的单个字节(显示在示波器跟踪中)。  

考虑到从器件地址为0x3b 并且3个数据字节都为零、我暂时想知道 heck 0x70的来源以及我做的任何事情可能发生什么?!?!?

如照片所示、该单字节之后不会出现任何其他内容。 我在这里包含了图片和代码片段。

如往常一样,我们将非常感谢任何出色的建议。

大卫

void IO_Expander (void)

Uint16 W_R;
long int W_T = 0;
UINT16索引= 0;
PNT_IO_EXPANDER_1 =&IO_EXPANDER_1;//初始化 IO 扩展器消息块的指针
PNT_IO_Expander 2 =&IO_Expander 2;
PNT_IO_Expander 1->SlaveAddress = 0x38;
PNT_IO_Expander 2->SlaveAddress = 0x3B;

对于(索引= 0;索引<= 55;索引++)

PNT_IO_Expander 1->MemoryLowAddr = IO_Register[Index];
PNT_IO_Expander 1->NumOfBytes = 2;
PNT_IO_Expander 1->MsgBuffer[0]= U1_Init[Index]>>8;//加载数据的高字节
PNT_IO_Expander 1->MsgBuffer[1]= U1_Init[Index]& 0x00ff;//加载数据的低字节
对于(W_T = 0;W_T < 10000;W_T ++)//等待传输循环

W_R = I2CA_WriteData (pnt_IO_Expander);
如果(W_R =0)

W_R = W_T;
break;//如果消息响应"良好",则离开循环
}
}

}

对于(索引= 0;索引<= 55;索引++)

PNT_IO_Expander 2->MemoryLowAddr = IO_Register[Index];
PNT_IO_Expander 2->NumOfBytes = 2;
PNT_IO_Expander 2->MsgBuffer[0]= U2_Init[Index]>>8;//加载数据的高字节
PNT_IO_Expander 2->MsgBuffer[1]= U2_Init[Index]& 0x00ff;//加载数据的低字节
对于(W_T = 0;W_T < 10000;W_T ++)//等待传输循环

W_R = I2CA_WriteData (pnt_IO_Expander 2);
如果(W_R =0)

W_R = W_T;
break;//如果消息响应"良好",则离开循环
}
}

}
}
//
// I2CA_WriteData -发送 I2CA 消息
//
UINT16 I2CA_WriteData (结构 I2C_IO_MSG * msg)

UINT16 I;

//
//等待 STP 位从之前的任何主器件通信中清除。
//模块对该位的清零延迟到 SCD 位结束后
//设置。 如果在启动一条新消息前这个位未被选中、那么
// I2C 可能会变得混淆。
//
if (I2caRegs.I2CMDR.bit.stp == 1)

返回 I2C_STP_NOT_READY_ERROR;
}

//
//设置从机地址
//
I2caRegs.I2CSAR.all = msg->SlaveAddress;

//
//检查总线是否繁忙
//

if (I2caRegs.I2CSTR.bit.BB == 1)

返回 I2C_BUS_BUS_ERROR;
}

//
//设置要发送的字节数
// MsgBuffer +地址
//
I2caRegs.I2CCNT = msg->NumOfBytes+1;

//
//设置要发送的数据
//
// I2caRegs.I2CDXR.all = msg->MemoryHighAddr;
I2caRegs.I2CDXR.all = msg->MemoryLowAddr;

对于(I=0;I < msg->NumOfBytes;I++)

I2caRegs.I2CDXR.all =*(msg->MsgBuffer+I);
}

//
//作为主发送器发送启动
//
I2caRegs.I2CMDR.all = 0x6620;

返回 I2C_SUCCESS;
}

//
// I2CA_ReadData -读取 I2CA 消息

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在进一步了解这种情况后、我意识到了范围是什么。 它显示的是左移1位的正确地址。 也就是说、这是一个"写入"、从器件不提供一个"ACK"...