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

📄 sd2300.c

📁 基于单片机的录放芯片控制应用源代码!请放心下载
💻 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 + -