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.

[参考译文] TMS320F2.8377万S:与DS1672连接时的I2C通信问题

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/618709/tms320f28377s-i2c-communication-issue-while-interfacing-with-ds1672

部件号:TMS320F2.8377万S

大家好,我是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);//读取数据表单

//返回接收到的数据
返回时间戳;
}//

文件结束

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

    我在针mux表中看不到针52和59的SDAA和SCLA选项。 我认为您需要选择不同的PIN。

    www.ti.com/.../terminal-configuration-and-functions

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

    嘿,惠特尼,抱歉,我对PIN码感到困惑。 因此,mux 6上的GPIO 91和92应该是GPIO。 我已经更正了代码,但它仍然没有做任何事情。 与逻辑分析仪无通信。 以下是更新的代码。

    //###################################################################
    //
    //文件:main.c
    ////#######################################################################################################################################################################################################################
    
    
    //包含的文件
    #include "F28x_Project.h"
    
    //定义
    #define I2C_timeout ((UINT16) 1024)
    
    // private functions
    void i2c_a_init (void);
    UINT64 i2c_a_read_data (void);
    
    /*
    @brief main function
    *@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
    }/*
    
    
    @简要初始化I2CA设置
    *@param none
    *@return none
    */
    void i2c_a_init (void)
    {
    I2caRegs.I2CSAL.ALL = 0x0068; // 7位从属地址- DS1672
    
    /*
    *在本例中,仅初始化SCI-A端口的引脚。
    *在F2837xS_GPIO.c文件中可以找到这些函数。
    */
    GPIO_SetupPinMux (91,GPIO _MUX_CPU1,6);
    GPIO_SetupPinMux (92,GPIO _MUX_CPU1,6);
    GPIO设置引脚选项(91,GPIO输入,GPIO上拉);
    GPIO设置引脚选项(92,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;
    }/*
    
    
    @brief Read I2CA Message
    *@param none
    *@Return none
    */
    UINT64 i2c_a_read_data (void)
    {
    I2caRegs.I2CMDR.All = 0x2E20; //主发送器,I2C启用
    
    I2caRegs.I2CCNT = 0x02; //设置要发送的字节数
    I2caRegs.I2CDXL.ALL = 0x00; //为字节配置fifo数据
    I2caRegs.I2CDXL.ALL = 0x00; //地址0x0000
    
    UINT16 timeout_copy; //超时期
    timeout_copy = I2C_timeout; //获取超时值
    
    while ((I2caRegs.I2CMDR.bit.stp == 1)&&(timeout_copy > 0U))
    {
    //等待i2c总线结束之前的任何通信
    timeout_copy--;
    }
    
    I2caRegs.I2CSAL.all=0x0068; // 7位从属地址- DS1672
    I2caRegs.I2CMDR.ALL = 0x2C20; //主接收器,I2C启用
    
    timeout_copy = I2C_timeout; //获取超时值
    
    while ((I2caRegs.I2CSTR.bit.BB == 1)&&(timeout_copy > 0U))
    {
    //等待总线空闲
    timeout_copy--;
    }
    
    UINT64 TIMESTAMP_MAIN = 0U;
    UINT64 TIMESTAMP_0 = 0U;
    UINT64 TIMESTAMP_1 = 0U;
    UINT64 TIMESTAMP_2 = 0U;
    UINT64 TIMESTAMP_3 = 0U;
    
    I2caRegs.I2CCNT = 0x04; //设置要接收的字节数
    TIMESTAMP_0 = I2caRegs.I2CDRR.ALL; //读取数据表单
    TIMESTAMP_1 = I2caRegs.I2CDRR.ALL; //读取数据表单
    TIMESTAMP_2 = I2caRegs.I2CDRR.ALL; //读取数据表单
    TIMESTAMP_3 = I2caRegs.I2CDRR.ALL; //读取数据表单
    
    timestamp_main = timestamp_3; //提取MSB
    TIMESTAMP_MAIN =(TIMESTAMP_MAIN << 8u)+ TIMESTAMP_2;
    TIMESTAMP_MAIN =(TIMESTAMP_MAIN << 8u)+ TIMESTAMP_1;
    TIMESTAMP_MAIN =(TIMESTAMP_MAIN << 8u)+ TIMESTAMP_0;
    
    //返回接收到的数据
    返回timestamp_main;
    }//
    
    文件结束
    

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

    我有点担心您的计时。 你在最初的帖子中说你正在运行10MHz SYSCLK,这是真的吗? 是否更改了InitSysCtrl()? 请注意,原始代码应配置SYSCLK为200MHz。

    您能否向我解释您如何计算I2CPSC和I2CCLKH/L的值?

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

    我没有更新InitSysCtrl()。 我认为10 MHz SYSCLK的原因是我在 默认状态下运行它。 如果我阅读了INTOSC2描述,它会显示:“在通电时,设备从片上10 MHz振荡器(INTOSC2)计时。 INTOSC2是主内部时钟源,是重设时的默认系统时钟。" 我所关心的只是我的I2C设备的工作频率为100KHz。 以下是 InitSysCtrl()的定义以供参考。

    ////
    InitSysCtrl -系统资源的初始化。
    //
    void InitSysCtrl (void)
    {
    //
    //禁用看门狗
    //
    DisableDog ();
    
    #ifdef _flash
    //
    //将时间关键代码和闪存设置代码复制到RAM。 这包括
    //以下函数:InitFlash()
    //
    // RamfuncsLoadStart,RamfuncsLoadSize和RamfuncsRunStart
    //符号由链接器创建。 请参阅设备.cmd文件。
    //
    memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
    
    //
    //呼叫闪存初始化以设置闪存等待。 此功能必须
    //驻留在RAM中。
    //
    InitFlash_Bank0();
    #endif
    
    //
    // *重要*
    //
    // Device_cal函数,用于复制ADC和振荡器校准
    //从TI预留OTP到相应的微调寄存器中的值发生
    //在引导ROM中自动执行。 如果在期间绕过引导ROM代码
    //调试过程中,必须为ADC和调用以下函数
    //振荡器根据规格工作。 时钟到
    //必须在调用此函数之前启用ADC。
    //
    //有关详细信息,请参阅器件数据手册和/或ADC参考手册
    //信息。
    //
    EALLOW;
    
    //
    //在未绑定的IOS上尽快启用上拉功能,以降低功耗
    //消耗。
    //
    GPIO_EnableUnbondedIOPullups();
    
    CpuSysRegs.PCLKCR13.bit.ADC_A = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
    CpuSysRegs.PCLKCR13.bit.ADC_D = 1;
    
    //
    //检查设备是否已剪裁
    //
    IF (*((UINT16 *) 0x5D1B6)== 0x0000){
    //
    //设备未被剪裁--应用静态校准值
    //
    AnalogSubsysRegs.ANAAREFTRIMA.ALL = 3.1709万;
    AnalogSubsysRegs.ANAREFTRIMB.ALL = 3.1709万;
    AnalogSubsysRegs.ANAREFTRIC.ALL = 3.1709万;
    AnalogSubsysRegs.ANAREFTRIMD.All = 3.1709万;
    }
    
    CpuSysRegs.PCLKCR13.bit.ADC_A = 0;
    CpuSysRegs.PCLKCR13.bit.ADC_B = 0;
    CpuSysRegs.PCLKCR13.bit.ADC_C = 0;
    CpuSysRegs.PCLKCR13.bit.ADC_D = 0;
    EDIS;
    
    //
    //初始化PLL控件:SYSPLLMULT和SYSCLKDIVSEL。
    //
    //定义了要作为参数传递到此函数的已定义选项
    //在F2837xS_Examples.h.中
    //
    //注:如果是,则内部振荡器不能用作PLL源
    // PLLSYSCLK被配置为高于194 MHz的频率。
    //
    // PLLSYSCLK =(XTAL)*(IMULT + FMULT)/(PLLSYSCLKDIV)
    //
    #ifdef _LAUNCXL_F2.8377万S
    InitSysPll (XTAL_OSC,IMULT_40,FMULT_0,PLLCLK_BY_2);
    #else
    InitSysPll (XTAL_OSC,IMULT_20,FMULT_0,PLLCLK_BY_2);
    #endif
    
    //
    //打开所有外围设备
    //
    InitPeripheralClocks();
    } 

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

    复位时,设备正在以10MHz INTOSC2运行,是。 但是,InitSysCtrl()调用InitSysPll()函数,该函数将切换到外部振荡器,然后配置PLL和分配器,使您达到200MHz。 因此,您需要调整I2CPSC和I2CCLKC/H的值,它们是您选择在200MHz系统时钟中考虑的。

    另外,请注意,如果您使用的是LaunchPad,您需要确保在预定义的符号中包含_LAUNCHXL_F2.8377万S,以便使用外部振荡器对InitSysPll()的正确调用。

    Whitney

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

    感谢Whitney的澄清!
    在用户指南中,我可以看到公式:
    模块时钟频率=( I2C输入时钟频率/(IPSC +1 ))
    在本例中,F2.8377万S LP以200MHz运行(在设置了_LAUNCHXL_F2.8377万S符号之后)。 所以如果我把那个(200MHz)作为I2C输入时钟频率,我需要把模块时钟频率调到  7-12MHz之间。 让我们选择10MHz。 然后

    10E6 = 200E6 /(IPSC+1)

    我们将IPSC 订为19。 现在,要选择I2CCK1/H,让我们假设我们想要50 % 占空比(即 ICCL=ICCH)。   

    t_mst =( IPSC +1 )[( ICCL + d )+( ICCH + d )]/( I2C输入时钟频率)

    然后ICCH和ICCL各显示为45。 请验证我的计算。 但我仍然没有看到任何沟通。

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

    好的,这些数字对我来说都很好。

    所以你在线上什么都看不到吗? 您是否看到SDA被拉低或有任何东西? 如果在发送两个0x00字节后设置断点,您在TX FIFO状态字段中看到什么? 这两个字节是否仍在FIFO中?

    谢谢!

    Whitney

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

    惠特尼,我认为我尝试连接的硬件需要更强的拉力。 因此,我在硬件侧添加了上拉,并删除了相应的代码。 它起了作用。 非常感谢,Whitney。 对于关注此线程的其他人,下面是更新的工作代码:

    //###################################################################
    //
    //文件:main.c
    ////#######################################################################################################################################################################################################################
    
    
    //包含的文件
    #include "F28x_Project.h"
    #include "F2837xS_Examples.h"
    
    //定义
    #define I2C_timeout ((UINT16) 1024)
    
    //私有函数
    void i2c_a_init(void);
    void i2c_a_gipo_init(void);
    UINT16 i2c_a_read_data(UINT16);
    void i2c_a_write_data(UINT16, UINT16);
    UINT64 i2c_read_timestamp(void);
    void delay_loop (void);
    
    /*
    *@brief main函数
    *@param none
    *@return none
    */
    void main (void)
    {
    /*
    *初始化系统控制:
    * PLL,看门狗,启用外设时钟
    *此示例函数可在F2837xS_sysctrl.c文件中找到。
    */
    InitSysCtrl();
    
    //初始化GPIO:
    伊尼特·格皮奥();
    I2C_A_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();
    
    //启用全局中断和更高优先级的实时调试事件:
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM
    
    // I2C的测试调用
    UINT64 DATA_Read = i2c_a_read_timestamp();
    
    return;
    }/*
    
    
    *@brief Initialize I2CA settings
    *@param none
    *@return none
    */
    void i2c_a_init (void)
    {
    I2caRegs.I2CSAL.ALL = 0x0068; // 7位从属地址- DS1672
    
    //在主发射器模式下初始化I2C
    I2caRegs.I2CPsc.all = 19;// I2C时钟应介于7MHz-12MHz之间
    I2caRegs.I2CCLKL = 45; //预校准器设置为100kHz比特率
    I2caRegs.I2CCLKH = 45; //在10MHz I2C时钟上
    
    //I2caRegs.I2CFFTX.ALL = 0x6000;//启用FIFO模式和TXFIFO
    //I2caRegs.I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT
    
    return;
    }/*
    
    
    @brief配置I2C-A GPIOs *
    @param none
    *@return none
    */
    void i2c_gPIO_init (void)
    {
    EALLOW;
    
    //为选定的I2C引脚设置限制
    gpioCtrlRegs.GPCQSEL2.bit.GPIO91 = 3;
    gpioCtrlRegs.GPCQSEL2.bit.GPIO92 = 3;
    
    //配置哪些GPIO引脚将是I2C_A引脚
    //使用GPIO寄存器
    gpioCtrlRegs.GPCGMUX2.bit.GPIO91 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO91 = 2;
    gpioCtrlRegs.GPCGMUX2.bit.GPIO92 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO92 = 2;
    
    EDIS;
    }/*
    
    
    @简要读取给定寄存器地址
    的I2C-A数据*@要读取的参数寄存器地址
    *@返回数据读取
    */
    UINT16 i2c_read_data (UINT16 register_address)
    {
    //启动条件,停止条件,主,发送器,I2C启用
    I2caRegs.I2CMDR.All = 0x2E20;
    
    I2caRegs.I2CCNT = 0x01; //要发送的字节-始终为1
    I2caRegs.I2CDXL.ALL =注册地址;//注册位置
    
    UINT16 timeout_copy = I2C_timeout; //超时期
    
    while ((I2caRegs.I2CMDR.bit.stp == 1)&&(timeout_copy > 0U))
    {
    //等待i2c总线结束之前的任何通信
    timeout_copy--;
    }
    
    //启动条件,停止条件,主控,I2C启用
    I2caRegs.I2CMDR.ALL = 0x2C20;
    
    timeout_copy = I2C_timeout; //获取超时值
    
    while ((I2caRegs.I2CSTR.bit.BB == 1)&&(timeout_copy > 0U))
    {
    //等待总线空闲
    timeout_copy--;
    }
    
    I2caRegs.I2CCNT = 0x01; //要接收的字节-始终为1
    返回I2caRegs.I2CDRR.ALL; //读取和返回数据
    }/*
    
    
    @简要将I2C-A数据写入给定的寄存器地址
    *@要写入的参数寄存器地址和寄存器值
    *@返回none
    */
    void i2c_write_data (UINT16 register_address, UINT16 register_value)
    {
    //启动条件,停止条件,主,发送器,I2C启用
    I2caRegs.I2CMDR.All = 0x2E20;
    
    I2caRegs.I2CCNT = 0x02; //要发送的字节-此处为2
    I2caRegs.I2CDXL.ALL =注册地址;//注册位置
    I2caRegs.I2CDXL.ALL = REGISTER_VALUE;//注册位置
    
    UINT16 timeout_copy; //超时期
    timeout_copy = I2C_timeout; //获取超时值
    
    while ((I2caRegs.I2CMDR.bit.stp == 1)&&(timeout_copy > 0U))
    {
    //等待i2c总线结束之前的任何通信
    timeout_copy--;
    }
    }/*
    
    
    @brief此函数返回当前时间戳
    *@param none
    *@返回时间戳值
    */
    UINT64 i2c_a_read_timestamp (void){
    
    UINT16索引;
    UINT64 TIMESTAMP_MAIN = 0U;
    UINT64 TIMESTAMP[5]={0U,0U,0U,0U,0U};
    
    
    //读取振荡器控制的状态
    UINT64 EOSC = i2c_a_read_data(0x04);
    delay_loop();
    
    IF (EOSC和0x80) //如果振荡器未启用
    {
    
    //通过将0写入EOSC位来启用振荡器
    I2C_A_WRITE数据(0x00,0x00);
    }
    
    //丢弃第一个垃圾读取,然后将寄存器0x00读为0x03
    对于(index=0U;index<5U;index++)
    {
    timestamp[index]= i2c_a_read_data (index);
    delay_loop();
    }
    
    
    //连接时间戳值
    timestamp_main = timestamp[4]; //提取MSB
    timestamp_main =(timestamp_main << 8u)+ timestamp[3];
    timestamp_main =(timestamp_main << 8u)+ timestamp[2];
    timestamp_main =(timestamp_main << 8u)+ timestamp[1];
    
    return timestamp_main;
    }/*
    
    @短促延迟的简短循环
    *@param none
    *@return none
    */
    void delay_loop (void){
    
    长I;
    (i = 0;i < 1万;I++)
    {
    
    }
    }//
    
    文件结束
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很棒! 很高兴你发现了它。 感谢您分享您的解决方案。

    Whitney