📄 main.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 + -