大家好,我是TMS320F2.8377万S的新手。 我正在尝试通过I2C将它与DS1672 (32位二进制计数器RTC)连接。 我在控制套件中找到了一个示例代码,并参考了它,修改了代码。 但它不起作用。 我在逻辑分析仪上看不到I2C总线上有任何通信。 我也不怀疑GPIO初始化是否正确。 我在PIN 59上有SCL线,SDA超过52。 我也尝试启用上拉功能。 默认情况下,处理器以10MHz运行,我的I2C设备以100KHz运行。 我正在尝试从地址0x00开始读取4个寄存器。 所以我陷入困境,请帮忙。 提前感谢。 这是完整的代码,它位于单个文件中。
//###################################################################
//
//文件:main.c
////#######################################################################################################################################################################################################################
//包含的文件
#include "F28x_Project.h"
void i2c_a_init(void);
UINT64 i2c_a_read_data(void);
/*
@brief main函数
*@param none
*@return none
*/
void main (void){
/*
*初始化系统控制:
* PLL,看门狗,启用外设时钟
*此示例函数可在F2837xS_sysctrl.c文件中找到。
*/
InitSysCtrl();
//初始化GPIO:
伊尼特·格皮奥();
/*
*清除所有中断并初始化PIE矢量表:
*禁用CPU中断
*/
色调;
/*
*将PIE控制寄存器初始化为其默认状态。
*默认状态为禁用所有PIE中断和标志
*被清除。
*此函数位于F2837xS_PIECTRL.c文件中。
*/
InitPieCtrl();
//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
/*
*使用指向外壳中断的指针初始化PIE矢量表
*服务例程(ISR)。
*这将填充整个表,即使中断也是如此
本例中不使用*。 这对于调试非常有用。
* shell ISR例程可在F2837xS_DefaultIsr.C.中找到
*此函数可在F2837xS_PieVect.C.中找到
*/
InitPieVectorTable();
//初始化设备外围设备:
I2C_A_INIT();
UINT16索引= 0U;
// I2C的测试调用
for (; index<8u;index++)
{
UINT64 DATA_Read = i2c_a_read_data();
}
//printf ("\n Hello World \n");
//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
}/*
i2c_a_init -初始化I2CA设置
*/
void i2c_a_init (void)
{
I2caRegs.I2CSAL.ALL = 0x0068; // 7位从属地址- DS1672
/*
*在本例中,仅初始化SCI-A端口的引脚。
*在F2837xS_GPIO.c文件中可以找到这些函数。
*/
GPIO_SetupPinMux (52,GPIO _MUX_CPU1,6);
GPIO_SetupPinMux (59,GPIO _MUX_CPU1,6);
GPIO设置引脚选项(52,GPIO输入,GPIO上拉);
GPIO设置引脚选项(59,GPIO输入,GPIO上拉);
//在主发射器模式下初始化I2C
I2caRegs.I2CPsc.all = 0;// I2C时钟应介于7MHz-12MHz之间
I2caRegs.I2CCLKL = 43; //预校准器设置为100kHz比特率
I2caRegs.I2CCLKH = 43; //在10MHz I2C时钟上
I2caRegs.I2CFFTX.ALL = 0x6000;//启用FIFO模式和TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT
return;
}/*
i2c_read_data -读取I2CA消息
*/
UINT64 i2c_a_read_data (void)
{
I2caRegs.I2CMDR.All = 0x2E20; //主发送器,I2C启用
I2caRegs.I2CCNT = 0x02; //设置要发送的字节数
I2caRegs.I2CDXL.ALL = 0x00; //为字节配置fifo数据
I2caRegs.I2CDXL.ALL = 0x00; //地址0x0000
while (I2caRegs.I2CMDR.bit.stp == 1)
{
//wait for i2c bus to end any previous communication
}(等待i2c总线结束任何以前的通信)
I2caRegs.I2CSAL.all=0x0068; // 7位从属地址- DS1672
I2caRegs.I2CMDR.ALL = 0x2C20; //主接收器,I2C启用
while (I2caRegs.I2CSTR.bit.BB == 1)
{
//等待总线空闲
}
UINT64 TIMESTAMP = 0U;
I2caRegs.I2CCNT = 0x04; //设置要接收的字节数
时间戳=时间戳| I2caRegs.I2CDRR.ALL; //读取数据表单
timestamp = timestamp |(I2caRegs.I2CDRR.All << 8u);//读取数据表单
timestamp = timestamp |(I2caRegs.I2CDRR.All <16U);//读取数据表单
timestamp = timestamp |(I2caRegs.I2CDRR.All <<24U);//读取数据表单
//返回接收到的数据
返回时间戳;
}//
文件结束