📄 sd2300.c
字号:
//----- 要包含头文件 ----------------------------------------------------------
#include <avr/io.h> // AVR I/O 定义
#include <avr/signal.h> // "signal" 宏定义
#include <avr/interrupt.h> // 中断支持
#include <avr/wdt.h> // 看门狗
#include <avr/pgmspace.h> // PGM支持
#include <avr/delay.h> // delay
#include <avr/eeprom.h> // eeprom
#include "includes.h"
#include "sd2300.h"
//18->0x18
unsigned char hexToBcd(unsigned char i)
{
unsigned char j;
j=(i/10*16+i%10);
return j;
}
//2位ASCII码转整数 "08" -->0x08; "18" -->0x12
unsigned char a2toi(unsigned char* from)
{
unsigned char buf[2];
buf[0]=from[0];
buf[1]=from[1];
return((atoi(buf)));
}
//BCD码转ASCII 0x08 --> "08"; 18(0x12) --> "12"; 0x18 -->"18"
void hextoa2(unsigned char hex ,unsigned char* to)
{
to[0]=(hex/16)+'0';
to[1]=(hex%16)+'0';
}
//2位ASCII码转BCD "08" -->0x08; "18" -->0x18
unsigned char a2tobcd2(unsigned char* from)
{
return(hexToBcd(a2toi(from)));
}
//TWI初始化
void twiInit(void)
{
//调整端口设置,设置为上拉输入
DDRC &= ~(BV(PC0) | BV(1<<PC1));
PORTC |=(BV(PC0) | BV(1<<PC1));
//设置TWI波特率
TWBR = TWBR_SELECT;
}
//总线上起动开始条件
void twiStart(void)
{
TWCR = BV(TWINT) | BV(TWSTA) | BV(TWEN);
while ((TWCR & _BV(TWINT)) == 0) ;
//return TWSR;
}
//总线上起动停止条件
void twiStop(void)
{
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);
}
//写一字节
void twiWriteByte(u08 c)
{
TWDR = c;
TWCR = _BV(TWINT) | _BV(TWEN);
while ((TWCR & _BV(TWINT)) == 0);
//return TWSR;
}
//读一字节,发ACK
u08 twiReadByteACK(void)
{
TWCR=_BV(TWINT)|_BV(TWEN)| _BV(TWEA);
while ((TWCR & _BV(TWINT)) == 0) ;
//*c=TWDR;
//return TWSR;
return TWDR;
}
//读一字节,发NACK
u08 twiReadByteNACK(void)
{
u08 c;
TWCR=_BV(TWINT)|_BV(TWEN);
while ((TWCR & _BV(TWINT)) == 0) ;
//*c=TWDR;
//return TWSR;
//return TWDR;
c=TWDR;
return c;
}
void sd2300Init(void)
{
//u08 temp[1];
twiInit();
//temp[0]=_BV(BALE)|_BV(SL1)|_BV(CT1)|_BV(CT0);
//temp[0]=_BV(AALE)|_BV(BALE)|_BV(SL1)|_BV(CT1)|_BV(CT0);
// 周期性中断从INTRA输出
// ALARM-B从INTRB输出
// 周期性为脉冲模式,1HZ
//temp[0]=_BV(BALE)|_BV(SL1)|_BV(CT1)|_BV(CT0);
//temp[0]
//temp[0]=_BV(BALE)|_BV(SL1)|_BV(CT1)|_BV(CT0);
//rtcWriteNByte(SD2K3_CTRL_REG1,1,temp);
/*sramReadNByte(BUFFER_FLAG_ADDR,1,temp);
if(temp[0]!=0xAA)
{
//初始化缓冲区
temp[0]=0xAA;
dataindex = 0;
datalength = 0;
sramWriteNByte((u16)BUFFER_FLAG_ADDR,1,temp);
writeBufferParam();
}
readBufferParam();
*/
}
//写n字节
//sla:I2C 设备地址
//addr: 寻址地址
//num:要写的字节数
//data:要写的数组指针
u08 _rtcWriteNByte(u08 sla,u08 addr,u08 num,u08 *data)
{
u08 n;
//发起START信号,开始写操作
twiStart();
//START信号成功发送了吗?不成功返回相应错误信息
if (TWSR != TW_START)
return TW_START;
twiWriteByte(sla);
// 寻址成功了吗?不成功返回相应错误信息
if (TWSR != TW_MT_SLA_ACK)
return TW_MT_SLA_ACK;
twiWriteByte(addr);
// 发送寻址地址成功了吗?不成功返回相应错误信息
if (TWSR != TW_MT_DATA_ACK)
return TW_MT_DATA_ACK;
for(n=0;n<num;n++)
{
twiWriteByte(*data);
data++;
//if (TWSR != TW_MT_DATA_ACK)
// return TW_MT_DATA_ACK;
}
twiStop();
return 0; // 成功,返回0
}
//读n字节
//sla:I2C 设备地址
//addr: 寻址地址
//num:要读取的字节数
//data:读取到的数据的保存数组指针
u08 _rtcReadNByte(u08 sla,u08 addr,u08 num,u08 *data)
{
u08 n;
//发起START信号,开始写操作
twiStart();
//START信号成功发送了吗?不成功返回相应错误信息
if (TWSR != TW_START)
return TW_START;
twiWriteByte(sla);
// 寻址成功了吗?不成功返回相应错误信息
if (TWSR != TW_MT_SLA_ACK)
return TW_MT_SLA_ACK;
twiWriteByte(addr);
// 发送寻址地址成功了吗?不成功返回相应错误信息
if (TWSR != TW_MT_DATA_ACK)
return TW_MT_DATA_ACK;
//为了提高读写速度,下面的错误监测已经被注释掉了
//一般情况下,一个IIC设备通过了上面总线状态和寻址,下面就不必要了
//重新发起START信号,开始读操作
twiStart();
// 寻址成功了吗?不成功返回相应错误信息
//if (TWSR != TW_MT_SLA_ACK)
// return TW_MT_SLA_ACK;
twiWriteByte(sla|0x01);
// 寻址成功了吗?不成功返回相应错误信息
//if (TWSR != TW_MR_SLA_ACK)
// return TW_MR_SLA_ACK;
for(n=0;n<num-1;n++)
{
*(data+n)=twiReadByteACK();
//if (TWSR != TW_MR_DATA_ACK)
// return TW_MR_DATA_ACK;
}
*(data+num-1)=twiReadByteNACK();
//if (TWSR != TW_MR_DATA_NACK)
// return TW_MR_DATA_NACK;
twiStop();
return 0; // 成功,返回0
}
//写SD2300 RTC寄存器
u08 rtcWriteNByte(u08 addr,u08 num,u08 *data)
{
return _rtcWriteNByte(SD2K3_RTC_ADDR,addr,num,data);
}
//读取SD2300 RTC寄存器
u08 rtcReadNByte(u08 addr,u08 num,u08 *data)
{
return _rtcReadNByte(SD2K3_RTC_ADDR,addr,num,data);
}
//得到日期和时间 datetime格式:14字节“20050101240000”
void getDateTime(u08* datetime)
{
u08 time[7];
*datetime='2';
*(datetime+1)='0';
rtcReadNByte(0,7,time);
hextoa2(time[6],datetime+2);//年
hextoa2(time[5],datetime+4);//月
hextoa2(time[4],datetime+6);//日
hextoa2(time[2],datetime+8);//时
hextoa2(time[1],datetime+10);//分
hextoa2(time[0],datetime+12);//秒
}
//设置日期和时间 datetime格式:14字节“20050101240000”
void setDateTime(u08* datetime)
{
u08 time[7];
time[0]=a2tobcd2(datetime+12);//秒
time[1]=a2tobcd2(datetime+10);//分
time[2]=a2tobcd2(datetime+8);//时
time[3]=1;//周
time[4]=a2tobcd2(datetime+6);//日
time[5]=a2tobcd2(datetime+4);//月
time[6]=a2tobcd2(datetime+2);//年
rtcWriteNByte(0,7,time);
}
/*
//写SD2300 SRAM n字节
u08 sramWriteNByte(u16 addr,u08 num,u08 *data)
{
u08 sla;
sla=SD2K3_RAM_ADDR;
sla|=((u08)(addr>>8))<<1;// 0<= 页地址 <=8
return _rtcWriteNByte(sla,(u08)(addr&0xFF),num,data);
}
//读取SD2300 SRAM n字节
u08 sramReadNByte(u16 addr,u08 num,u08 *data)
{
u08 sla;
sla=SD2K3_RAM_ADDR;
sla|=((u08)(addr>>8))<<1; // 0<= 页地址 <=8
return _rtcReadNByte(sla,(u08)(addr&0xFF),num,data);
}
*/
//end of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -