⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 IAR编译器下
💻 C
字号:
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "cpu.h"
#include "interrupt.h"

#define 	SETB_F_SDA()       	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_PIN_6)
#define 	SETB_F_SCL()       	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_PIN_5)

#define 	CLR_F_SDA()      	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, ~GPIO_PIN_6)
#define 	CLR_F_SCL()      	GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, ~GPIO_PIN_5)

#define         DelayNum                40
#define         FM3130WRADDR            0xA0
#define         FM3130RDADDR            0xA1
#define         RTC3130WRADDR           0xD0
#define         RTC3130RDADDR           0xD1

#define         NONE                    0x00
#define         BottomQtr               0x01
#define         BottomHalf              0x02
#define         FullArray               0x03

void I2C_init();
void Delay(unsigned short Num);
void I2CStart(void);
void I2CStop(void);
unsigned short WaitAck(void);
void SendAck(void);
void SendNotAck(void);
void I2CSendByte(unsigned char ucByte);
unsigned char I2CReceiveByte(void);
unsigned char FM3130RdData(unsigned int uiAddr, unsigned char *ucRdData, unsigned short usLenth);
unsigned char FM3130WrData(unsigned int uiAddr, unsigned char *ucWrData, unsigned short usLenth);
void DecToBcd(unsigned char *ucSrc, unsigned char *ucDest,unsigned short Count);
void BcdToDec(unsigned char *ucSrc, unsigned char *ucDest,unsigned short Count);
unsigned char RTCWrTime(unsigned char *WrTime);
unsigned char RTCRdTime(unsigned char *RdTime);
void RTCOscON();
void RTCOut512PWM();
void FMProtect(unsigned char ucProtMode);

unsigned char ucTime[7] = {0x08, 0x05, 0x30, 0x05, 0x14, 0x7, 0x0};
unsigned char ucBcdTest[10] = { 31, 12, 53, 44, 15, 56, 7, 28, 49, 50}; 
unsigned char ucTmp[32] = {0};
unsigned char ucTmp2[32] = {0};
//unsigned char Tmp = 0;
unsigned char Fm3130Status = 0;
int main(void)
{  
    
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_7_37MHZ);      //  设置系统时钟的频率7.37MHz    
    
    I2C_init();
   /*
    GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); 
    GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_4,
                       GPIO_STRENGTH_4MA,
                       GPIO_PIN_TYPE_STD); 
    */
    // 读写测试
    FM3130WrData(0x30, (unsigned char *)"1234567890abcdef1234567890abcdef", 32);
    Fm3130Status = FM3130RdData(0x30,ucTmp,32);
   
    RTCOscON();
    //DecToBcd(ucTime, ucTime, 7);
    RTCWrTime(ucTime);
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    
    //RTCWrTime(ucTime);
    RTCOut512PWM();
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    RTCRdTime(ucTmp);
    /*
    DecToBcd(ucBcdTest, ucTmp, 10);
    BcdToDec(ucTmp, ucTmp2, 10);
    */
    while(1);
}
/*
#define     NONE            0x00
#define     BottomQtr       0x01
#define     BottomHalf      0x02
#define     FullArray       0x03
*/
void FMProtect(unsigned char ucProtMode)
{
  
    unsigned char Tmp = 0;
    
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
        
    I2CSendByte(0x0E);
    WaitAck();
    
    I2CStart();
    I2CSendByte(RTC3130RDADDR);
    WaitAck();
    
    Tmp = I2CReceiveByte();
    SendNotAck(); 
    I2CStop();
    
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
      
    I2CSendByte(0x0E);
    WaitAck();
      
    I2CSendByte((Tmp & 0xE7) | (ucProtMode << 3));
    WaitAck();
      
    I2CStop();
}
void DecToBcd(unsigned char *ucSrc, unsigned char *ucDest,unsigned short Count)
{
   unsigned short i;
   for(i = 0; i < Count; i++)
   {
      ucDest[i] = (ucSrc[i] / 10) * 0x10 + ucSrc[i] % 10;
   }
}
void BcdToDec(unsigned char *ucSrc, unsigned char *ucDest,unsigned short Count)
{
   unsigned short i;
   for(i = 0; i < Count; i++)
   {
      ucDest[i] = (ucSrc[i] >> 4) * 10 + (ucSrc[i] & 0x0F);
   }
}

void I2C_init()
{ 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  
    GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_5, GPIO_DIR_MODE_OUT); 
    GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_5,
                       GPIO_STRENGTH_4MA,
                       GPIO_PIN_TYPE_STD); 
    SETB_F_SCL();
    Delay(DelayNum);
    SETB_F_SDA(); 
    Delay(DelayNum);
}
void Delay(unsigned short Num)
{
  while(Num--);
}
void RTCOscON()
{
    unsigned char Tmp = 0;
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
        
    I2CSendByte(0x01);
    WaitAck();
    
    I2CStart();
    I2CSendByte(RTC3130RDADDR);
    WaitAck();
    
    Tmp = I2CReceiveByte();
    SendNotAck(); 
    I2CStop();
    
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
      
    I2CSendByte(0x01);
    WaitAck();
      
    I2CSendByte(Tmp & 0x7F);
    WaitAck();
      
    I2CStop();

}
void I2CStart(void)
{
    SETB_F_SDA(); 
    Delay(DelayNum);
    SETB_F_SCL();
    Delay(DelayNum);
    CLR_F_SDA();
    Delay(DelayNum);
    CLR_F_SCL();
    Delay(DelayNum);
}

void I2CStop(void)
{
     CLR_F_SDA();
     Delay(DelayNum);
     SETB_F_SCL();
     Delay(DelayNum);
     SETB_F_SDA();
     Delay(DelayNum);
}
unsigned short WaitAck(void)
{
  //SETB_F_SDA();
  GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);
  Delay(DelayNum);
  SETB_F_SCL();
  Delay(DelayNum);
  while(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_6));
  GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_DIR_MODE_OUT);
  CLR_F_SCL();
  Delay(DelayNum);
  return 0x0;
}

void SendAck(void)
{
     CLR_F_SDA();
     Delay(DelayNum);
     SETB_F_SCL();
     Delay(DelayNum);
     CLR_F_SCL();
     Delay(DelayNum);    
}


void SendNotAck(void)
 {
     SETB_F_SDA();
     Delay(DelayNum);
     SETB_F_SCL();
     Delay(DelayNum);
     CLR_F_SCL();
     Delay(DelayNum); 
 }

void I2CSendByte(unsigned char ucByte)
{
     unsigned short  i = 0;
     unsigned short Tmp;
     Tmp = ucByte;
     Tmp = Tmp << 8;
     for(i = 0; i < 8; i++)
          {
            GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, Tmp >> (9 - i)); 
            SETB_F_SCL(); 
            Delay(DelayNum);
            CLR_F_SCL();
            Delay(DelayNum); 
          }
}


unsigned char I2CReceiveByte(void)
{
    unsigned char i = 0;
    unsigned char ucData = 0;
    //SETB_F_SDA();
    GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);
    for(i = 0; i < 8; i++)
       {
         SETB_F_SCL();
         Delay(DelayNum);
         ucData = ucData << 1;
         ucData |= (GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_6) >> 6);       
         CLR_F_SCL();
         Delay(DelayNum);
       }
    GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_DIR_MODE_OUT);
    return ucData;
}
unsigned char FM3130RdData(unsigned int uiAddr, unsigned char *ucRdData, unsigned short usLenth)
{
     unsigned short i;

     I2CStart();
     I2CSendByte(FM3130WRADDR);
     WaitAck(); 
     I2CSendByte(uiAddr >> 8);
     WaitAck();
     I2CSendByte(uiAddr&0x0FF);
     WaitAck();
     I2CStart();
     I2CSendByte(FM3130RDADDR);
     WaitAck();
      for(i = 0; i < usLenth; i++)
      {
          ucRdData[i] = I2CReceiveByte();
          if(i < (usLenth-1)) 
          {
            SendAck();
          }
      }
     SendNotAck(); 
     I2CStop();
     return true;
}

unsigned char FM3130WrData(unsigned int uiAddr, unsigned char *ucWrData, unsigned short usLenth)
{
  unsigned char i;

  I2CStart();
  I2CSendByte(FM3130WRADDR);
  WaitAck();
  
  I2CSendByte(uiAddr>>8);
  WaitAck();
  I2CSendByte(uiAddr&0x0FF);
  WaitAck();
  for(i = 0; i < usLenth; i++)
    {
      I2CSendByte(ucWrData[i]);
      WaitAck();
    }
  I2CStop();
  return true;
}

/***************************
WrTime 
数据格式:BCD
顺序为:年,月,日,星期,小时,分钟,秒
***************************/
unsigned char RTCWrTime(unsigned char *WrTime)
{
  unsigned char i;
  unsigned char ucRTCTimeAddr = 0x08;
  unsigned char Tmp = 0;
//读0x0寄存器  
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();
  
  I2CStart();
  I2CSendByte(RTC3130RDADDR);
  WaitAck();
  
  Tmp = I2CReceiveByte();
  SendNotAck(); 
  I2CStop();
//写0x0寄存器
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();
      
  I2CSendByte(Tmp | 0x02);
  WaitAck();
      
  I2CStop();
//更新时间
  for(i = 0; i < 7; i++)
  {
      I2CStart();
      I2CSendByte(RTC3130WRADDR);
      WaitAck();
      
      I2CSendByte(ucRTCTimeAddr);
      WaitAck();
      
      I2CSendByte(WrTime[i]);
      WaitAck();
      
      I2CStop();
      ucRTCTimeAddr--;
  }
//写0x0寄存器
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();
      
  I2CSendByte(Tmp & 0x0FD);
  WaitAck();
      
  I2CStop();
  
  return true;
}
/***************************
RdTime 
数据格式:BCD
顺序为:年,月,日,星期,小时,分钟,秒
***************************/
unsigned char RTCRdTime(unsigned char *RdTime)
{
  unsigned char i;
  unsigned char ucRTCTimeAddr = 0x08;
  unsigned char Tmp = 0;
//读0x0寄存器  
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();
  
  I2CStart();
  I2CSendByte(RTC3130RDADDR);
  WaitAck();
  
  Tmp = I2CReceiveByte();
  SendNotAck(); 
  I2CStop();
//写0x0寄存器
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();
      
  I2CSendByte(Tmp | 0x01);
  WaitAck();
      
  I2CStop();
//更新时间
  for(i = 0; i < 7; i++)
  {
      I2CStart();
      I2CSendByte(RTC3130WRADDR);
      WaitAck();
          
      I2CSendByte(0x08 - i);
      WaitAck();
      
      I2CStart();
      I2CSendByte(RTC3130RDADDR);
      WaitAck();
      
      RdTime[i] = I2CReceiveByte();
      SendNotAck(); 
      I2CStop();
      ucRTCTimeAddr--;
  }
//写0x0寄存器
  I2CStart();
  I2CSendByte(RTC3130WRADDR);
  WaitAck();
      
  I2CSendByte(0x0);
  WaitAck();

  I2CSendByte(Tmp & 0x0FE);
  WaitAck();
      
  I2CStop();
  /*
  RdTime[0] = RdTime[0];
  RdTime[1] = RdTime[1] & 0x1F;
  RdTime[2] = RdTime[2] & 0x3F;
  RdTime[3] = RdTime[3] & 0x07;
  RdTime[4] = RdTime[4] & 0x3F;
  RdTime[5] = RdTime[5] & 0x7F;
  RdTime[6] = RdTime[6] & 0x7F;
  */
  return true;
}
void RTCOut512PWM()
{
    unsigned char Tmp = 0;
    
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
        
    I2CSendByte(0x00);
    WaitAck();
    
    I2CStart();
    I2CSendByte(RTC3130RDADDR);
    WaitAck();
    
    Tmp = I2CReceiveByte();
    SendNotAck(); 
    I2CStop();
    
    I2CStart();
    I2CSendByte(RTC3130WRADDR);
    WaitAck();
      
    I2CSendByte(0x00);
    WaitAck();
      
    I2CSendByte(Tmp | 0x04);
    WaitAck();
      
    I2CStop();

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -