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.

[参考译文] TMS320F280025C:DS3231 RTC

Guru**** 2455490 points
Other Parts Discussed in Thread: TMS320F280025C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1299781/tms320f280025c-ds3231-rtc

器件型号:TMS320F280025C

#include "driverlib.h"
#include "device.h"

#include "i2cLib_FIFO_polling.h"


//
// Globals
//
struct I2CHandle RTC;

struct I2CHandle *currentMsgPtr;                   // Used in interrupt

//!  --------------------------------
//!    Signal   |  I2CA   | RTC
//!  --------------------------------
//!     SCL     | DEVICE_GPIO_PIN_SCLB   |  SCL
//!     SDA     | DEVICE_GPIO_PIN_SDAB   |  SDA
//!  --------------------------------


uint16_t passCount = 0;
uint16_t failCount = 0;

uint16_t AvailableI2C_targets[20];

uint16_t TX_MsgBuffer[MAX_BUFFER_SIZE];
uint16_t RX_MsgBuffer[MAX_BUFFER_SIZE];
uint32_t ControlAddr;
uint16_t status;
uint8_t set_time[7];


typedef struct{
   unsigned int seconds;
      unsigned int minutes ;
      unsigned int hour ;
      unsigned int dayofweek;
      unsigned int dayofmonth;
      unsigned int month ;
      unsigned int year ;
}TIME;

TIME time;


void fail(void);
void pass(void);

void I2C_GPIO_init(void);
void I2Cinit(void);
void verifyRTCRead(void);
unsigned int decToBcd( unsigned int );
unsigned int bcdToDec(unsigned int );
void Set_Time (uint8_t, uint8_t , uint8_t , uint8_t , uint8_t , uint8_t , uint8_t );
void Get_Time (void);
//
// Main
//
void main(void)
{
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Disable pin locks and enable internal pullups.
    //
    Device_initGPIO();

    //
    // Initialize I2C pins
    //
    I2C_GPIO_init();

    //
    // Initialize PIE and clear PIE registers. Disable CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    I2Cinit();
    //AvailableI2C_targets[0]=0xD0;

    //I2Cs connected to I2CA will be found in AvailableI2C_targets buffer
    //after you run I2CBusScan function.
    uint16_t *pAvailableI2C_targets = AvailableI2C_targets;
    status = I2CBusScan(I2CB_BASE, pAvailableI2C_targets);

    uint16_t i;

    for(i=0;i<MAX_BUFFER_SIZE;i++)
    {
        TX_MsgBuffer[i] = 0;
        RX_MsgBuffer[i] = 0;
    }

   RTC.TargetAddr      = 0xD0;
   RTC.base           = I2CB_BASE;
   RTC.pControlAddr   = &ControlAddr;
   RTC.NumOfAddrBytes = 2;
   RTC.pTX_MsgBuffer  = TX_MsgBuffer;
   RTC.pRX_MsgBuffer  = RX_MsgBuffer;
   RTC.NumOfAttempts  = 5;
   RTC.Delay_us       = 10;
   RTC.WriteCycleTime_in_us = 6000;    //10ms forRTC this code was tested

    //Example 1:RTC Byte Write
    //Write 11 toRTC address 0x0
   /* ControlAddr = 0;
   RTC.NumOfDataBytes = 7;
    TX_MsgBuffer[0]= 11;
    status = I2C_ControllerTransmitter(&RTC);

    //Wait forRTC write cycle time
    //This delay is not mandatory. User can run their application code instead.
    //It is however important to wait forRTC write cycle time before you initiate
    //another read / write transaction
    DEVICE_DELAY_US(RTC.WriteCycleTime_in_us);

    //Example 2:RTC Byte Read
    //Make sure 11 is written toRTC address 0x0
    ControlAddr = 0;
   RTC.pControlAddr   = &ControlAddr;
   RTC.NumOfDataBytes = 1;
    status = I2C_ControllerReceiver(&RTC);

    while(I2C_getStatus(RTC.base) & I2C_STS_BUS_BUSY);

    verifyRTCRead();*/

    //Example 3:RTC word (16-bit) write
    //RTC address 0x1 = 22 &  0x2 = 33
   Set_Time(00, 03, 14, 5, 3, 1, 19);
    ControlAddr = 0x00;   //RTC address to write
   RTC.NumOfDataBytes  = 7;
    TX_MsgBuffer[0]        = set_time[0];
    TX_MsgBuffer[1]        = set_time[1];
    TX_MsgBuffer[2]        = set_time[2];
    TX_MsgBuffer[3]        = set_time[3];
    TX_MsgBuffer[4]        = set_time[4];
    TX_MsgBuffer[5]        = set_time[5];
    TX_MsgBuffer[6]        = set_time[6];
   RTC.pTX_MsgBuffer = TX_MsgBuffer;
    status = I2C_ControllerTransmitter(&RTC);

    //Wait forRTC write cycle time
    //This delay is not mandatory. User can run their application code instead.
    //It is however important to wait forRTC write cycle time before you initiate
    //another read / write transaction
    DEVICE_DELAY_US(RTC.WriteCycleTime_in_us);

    while(1)
    {

    //Example 4:RTC word (16-bit) read
     //Make sureRTC address 1 has 0x11 and 2 has 0x22
     ControlAddr = 0x00;
    RTC.pControlAddr   = &ControlAddr;
    RTC.pRX_MsgBuffer  = RX_MsgBuffer;
    RTC.NumOfDataBytes = 7;

     status = I2C_ControllerReceiver(&RTC);

     Get_Time();

     //verifyRTCRead();
    }


    //Example 5:RTC Page write
    //Program address = data pattern from address 64

 /*   for(i=0;i<MAX_BUFFER_SIZE;i++)
    {
        TX_MsgBuffer[i] = i+64;
    }

    ControlAddr = 64;   //RTC address to write
   RTC.NumOfDataBytes  = MAX_BUFFER_SIZE;
   RTC.pTX_MsgBuffer   = TX_MsgBuffer;
    status = I2C_ControllerTransmitter(&RTC);

    //Wait forRTC write cycle time
    //This delay is not mandatory. User can run their application code instead.
    //It is however important to wait forRTC write cycle time before you initiate
    //another read / write transaction
    DEVICE_DELAY_US(RTC.WriteCycleTime_in_us);

    //Example 6:RTC word Paged read
    ControlAddr = 64;
   RTC.pControlAddr   = &ControlAddr;
   RTC.pRX_MsgBuffer  = RX_MsgBuffer;
   RTC.NumOfDataBytes = MAX_BUFFER_SIZE;

    status = I2C_ControllerReceiver(&RTC);

    verifyRTCRead();

    if(status)
    {
        fail();
    }
    else
    {
        pass();
    }



    if(status)
    {
        fail();
    }
    else
    {
        pass();
    }

    //////////////////
    Set_Time(00, 03, 14, 5, 3, 1, 19);
      while (1)
      {
          Get_Time();
      }

}

//
// pass - Function to be called if data written matches data read
//
void
pass(void)
{
    asm("   ESTOP0");
    for(;;);
}

//
// fail - Function to be called if data written does NOT match data read
//
void fail(void)
{
    asm("   ESTOP0");
    for(;;);*/
}

void verifyRTCRead(void)
{
    uint16_t i;
    while(I2C_getStatus(RTC.base) & I2C_STS_BUS_BUSY);

    for(i=0;i<RTC.NumOfDataBytes;i++)
    {
        if(RX_MsgBuffer[i] != TX_MsgBuffer[i])
        {
            //Transmitted data doesn't match received data
            //Fail condition. PC shouldn't reach here
            ESTOP0;
            fail();
        }
    }
}


void I2C_GPIO_init(void)
{
    // I2CA pins (SDAA / SCLA)
    GPIO_setDirectionMode(DEVICE_GPIO_PIN_SDAB, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(DEVICE_GPIO_PIN_SDAB, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAB, GPIO_QUAL_ASYNC);

    GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLB, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(DEVICE_GPIO_PIN_SCLB, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCLB, GPIO_QUAL_ASYNC);

    GPIO_setPinConfig( DEVICE_GPIO_CFG_SDAB);
    GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLB );
}

void I2Cinit(void)
{
    //myI2CA initialization
    I2C_disableModule(I2CB_BASE);
    I2C_initController(I2CB_BASE, DEVICE_SYSCLK_FREQ, 100000, I2C_DUTYCYCLE_50);
    I2C_setConfig(I2CB_BASE, I2C_CONTROLLER_SEND_MODE);
    I2C_setTargetAddress(I2CB_BASE, 0xD0);
    I2C_setOwnAddress(I2CB_BASE, 96); //I2CA address
    I2C_disableLoopback(I2CB_BASE);
    I2C_setBitCount(I2CB_BASE, I2C_BITCOUNT_8);
    I2C_setDataCount(I2CB_BASE, 2);
    I2C_setAddressMode(I2CB_BASE, I2C_ADDR_MODE_7BITS);
    I2C_enableFIFO(I2CB_BASE);
    I2C_clearInterruptStatus(I2CB_BASE, I2C_INT_ARB_LOST | I2C_INT_NO_ACK);
    I2C_setFIFOInterruptLevel(I2CB_BASE, I2C_FIFO_TXEMPTY, I2C_FIFO_RX2);
    I2C_enableInterrupt(I2CB_BASE, I2C_INT_ADDR_TARGET | I2C_INT_ARB_LOST | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION);
    I2C_setEmulationMode(I2CB_BASE, I2C_EMULATION_FREE_RUN);
    I2C_enableModule(I2CB_BASE);
}

void Get_Time (void)
{
   // uint8_t get_time[7];
    //HAL_I2C_Mem_Read(&hi2c1, DS3231_ADDRESS, 0x00, 1, get_time, 7, 1000);
    time.seconds = bcdToDec(RX_MsgBuffer[0]);
    time.minutes = bcdToDec(RX_MsgBuffer[1]);
    time.hour = bcdToDec(RX_MsgBuffer[2]);
    time.dayofweek = bcdToDec(RX_MsgBuffer[3]);
    time.dayofmonth = bcdToDec(RX_MsgBuffer[4]);
    time.month = bcdToDec(RX_MsgBuffer[5]);
    time.year = bcdToDec(RX_MsgBuffer[6]);
}

void Set_Time (uint8_t sec, uint8_t min, uint8_t hour, uint8_t dow, uint8_t dom, uint8_t month, uint8_t year)
{

    set_time[0] = decToBcd(sec);
    set_time[1] = decToBcd(min);
    set_time[2] = decToBcd(hour);
    set_time[3] = decToBcd(dow);
    set_time[4] = decToBcd(dom);
    set_time[5] = decToBcd(month);
    set_time[6] = decToBcd(year);

    //HAL_I2C_Mem_Write(&hi2c1, DS3231_ADDRESS, 0x00, 1, set_time, 7, 1000);
}
unsigned int decToBcd( unsigned int val)
{
  return (uint8_t)( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
unsigned int bcdToDec(unsigned int val)
{
  return (int)( (val/16*10) + (val%16) );
}
//
// End of File
//

我已经通过使用 EEPROM 轮询示例代码、为 TMS320F280025c 板使用 I2C 协议实现了 DS3231RTC 的该代码 ...但我没有得到输出... 请检查此代码一次...如果因此代码需要任何 修改,请告诉 我...

实际上 在这个指令(在下面)中、数据不会进入从器件  

 状态= I2C_ControllerTransmitter (&RTC);  

我无法从以下指令获取数据、

状态= I2C_ControllerReceiver (&RTC);

主要问题是这里数据不是感应到从属.这是主要问题

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

    您好!  

    你能检查 I2C 寄存器,特别是 I2C 状态寄存器,看看它是否指示任何错误吗?

    此致

    西达尔特

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

    I2C 寄存器 means...please 您能详细介绍一下吗...

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

    您好!

    您可以在 CCS 寄存器视图中查看"I2CSTR"寄存器的值。  您可以参考 F280025C 的 TRM 来获取有关 I2C 寄存器的更多详细信息、

    此致

    西达尔特