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

📄 mmc.c

📁 mmc单片机读写程序 mmc单片机读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//**************************************
// Moving Sign V:1.0
// Version 1.0 Dec 2003
// Sylvain Bissonnette
//
// Clock : 8Mhz
// Stack : 32
//**************************************
#include <macros.h>
#include <stdlib.h>
#include <iom8v.h> 
#include <eeprom.h>
#include <STRING.H>

#define VERSION     10
#define TRUE        0x01
#define FALSE       0x00

#define SPIDDR      DDRB
#define SPIPORT     PORTB
#define SPIPIN      PINB


#define SCLK        0x20
#define MOSI        0x08
#define MISO        0x10
#define CS          0x04
#define MMCPOWER    0x80


#define			D_OUT	0x04
#define			LAT		0x08
#define			EN		0x10
#define			TXD		0x20
#define			LED		0x04
//static const char FontLookup [][5] =
//{
//    { 0x3c, 0x41, 0x42, 0x20, 0x7c }    // ?   
//};

//**************************************
//          P R O T O T Y P E
//**************************************

void main(void);
void uart1_rx_isr(void);
void adc_isr(void);
void Delay_1ms(int Del);
void PLAY_ANI(unsigned long Ani_End, unsigned int Speed);
void Delay(int del);
int MMCInit(void);
void MMCInfo(void);
int MMCReadSector(unsigned long lba, unsigned char * s);
int MMCWriteSector(unsigned long lba, unsigned char *s);
unsigned char MMCGet(void);
unsigned char MMCDataToken(void);
void MMCCommand(unsigned char command, unsigned int px, unsigned int py);

unsigned char SpiByte(unsigned char byte);

unsigned char read_VFAT_info(void);

unsigned int Search_File(unsigned int num);
unsigned int read_word(unsigned int addr);
unsigned int next_cluster(unsigned int c, unsigned long sec, unsigned int remain);
char play_music(unsigned int fn);
unsigned int SectorNum =0;
unsigned char	DataBuff[512];

unsigned char	FATtype;		// 0:FAT12  1:FAT16
unsigned char	SectorsPerCluster;	
unsigned int	RootDirEntriesCount;
unsigned int	FATstart;
unsigned int	DIRstart;
//unsigned int	DataStart;//0-65535
unsigned long	DataStart;//0-4294967295
unsigned int	PlayMusic;		//

//unsigned int	n;

unsigned int FileCount;
unsigned long FileSize;
//unsigned char	FatCache[256];
unsigned long	FatCacheAddr;

unsigned int	Cluster;		//
unsigned int	NextCluster;	//
long	RemainSec;		//

unsigned char NewData = FALSE;

char RxBuffer[264];

void putchar(unsigned char c)    
  {
     while (!(UCSRA&(1 << UDRE)));   //判断上次发送有没有完成
     UDR = c;    
  }
/*			字符串输出函数	   	 */	
int puts(char *s)
	{
	while (*s)
		{
		putchar(*s);
		s++;
		}	
    putchar(0x0a);//回车换行
	putchar(0x0d);
	return 1;
	}
void DisPlay(void)
{
unsigned char ch;
unsigned int i,j;
unsigned char scnt;
 PORTD &=~EN;
  		 		for(j=0;j<512;j++)//512*4+352=2400
		 		{
						if (DataBuff[j]==0)
						{
							  PORTD &=~D_OUT;
							  PORTD &=~D_OUT;}
						else				  
     						 { PORTD |=D_OUT;
     						  PORTD |=D_OUT;}
					  	PORTD &= ~TXD; 
					  	PORTD &= ~TXD; 
					  	PORTD &= ~TXD; 
						PORTD |= TXD;  
						PORTD |= TXD;  	 		 		
						PORTD |= TXD;  	 		 		
				}	
}
void DisPlay_END(void)
{
unsigned char ch;
unsigned int i,j;
unsigned char scnt;
 PORTD &=~EN;
  		 		for(j=0;j<352;j++)//2400-512*4=352
		 		{
						if (DataBuff[j]==0)
						{
							  PORTD &=~D_OUT;
							  PORTD &=~D_OUT;}
						else				  
     						 { PORTD |=D_OUT;
     						  PORTD |=D_OUT;}
					  	PORTD &= ~TXD; 
					  	PORTD &= ~TXD; 
					  	PORTD &= ~TXD; 
						PORTD |= TXD;  
						PORTD |= TXD;  	 		 		
						PORTD |= TXD;  	 		 		
				}	
		 PORTD &=~LAT;
		 PORTD &=~LAT;
		 PORTD &=~LAT;
		 PORTD |=LAT;
		 PORTD |=LAT;
		 PORTD |=LAT;
				
}

void Delay(int del)
{
int i,j;
for (j=0;j<del;j++)
	{
	for (i=0;i<320;i++);
	}
}
void PLAY_ANI(unsigned long Ani_End, unsigned int Speed)
{
 	 				   PORTC ^=LED;
							SectorNum++;
							MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
							DisPlay();
							SectorNum++;
							MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
							DisPlay();
							SectorNum++;
							MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
							DisPlay();
							SectorNum++;
							MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
							DisPlay();
							SectorNum++;
							MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
							DisPlay_END();
							Delay(Speed);
							if (SectorNum>=Ani_End) 
							SectorNum=568-1;
}


//**************************************
//            M A I N
//**************************************

void main(void)
{
int x = 0;
int i = 0;
unsigned int POS =568;//FAT16格式中,第一个文件的起始扇区位置
unsigned char ANI_END_POS_0 =0;//FAT16格式中,第一个文件的结束扇区位置(最低位)
unsigned char ANI_END_POS_1 =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_END_POS_2 =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_END_POS_3 =0;//FAT16格式中,第一个文件的结束扇区位置(最高位)
unsigned long ANI_END_POS =0;//FAT16格式中,第一个文件的结束扇区位置
unsigned char ANI_Speed_L =0;//
unsigned char ANI_Speed_H =44;//
unsigned int ANI_Speed;//播出速度
unsigned int fn;
unsigned int vvv,vvvv;//adc5
char	r;

////////////////////////////////////////////////////////////////////////////////		
 	DDRC	=0x00;//adc5
	PORTC   =0x00;
	ADCSRA  =0x00;
	ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0); //采用内部2.56参考电压,ADC5输入
	ACSR= (1<<ACD);
    ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC转换 64分频
////////////////////////////////////////////////////////////////////////////////
	
	DDRD	=0xff;
	PORTD |=0xff;
	PORTD |=TXD;
	PORTD |=LAT;
	PORTD &=~EN;
	PlayMusic=1;
	fn=1;
	UCSRB =0x00;//ATmega8L
	UCSRA=0x00;//ATmega8L
	UCSRA=BIT(U2X);//波特率*2
	UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN);   //允许串口发送和接收,并响应接收完成中断
	UBRR = 25;                                  //时钟4Mhz,波特率25:9600  12:19200
    UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0);   //8位数据+1位stop位
	SEI();
	ANI_END_POS_0=EEPROMread(0);//16进制
	ANI_END_POS_1=EEPROMread(1);//16进制
	ANI_END_POS_2=EEPROMread(2);//16进制
	ANI_END_POS_3=EEPROMread(3);//16进制
	ANI_END_POS=(ANI_END_POS_3 << 24)+(ANI_END_POS_2 << 16)+(ANI_END_POS_1 << 8)+ANI_END_POS_0;
	//ANI_END_POS=1128;
	
 //	printf("ANI_END_POS: %u\n",SectorNum);
	
	ANI_Speed_L=EEPROMread(4);//16进制
	ANI_Speed_H=EEPROMread(5);//16进制
	ANI_Speed=(ANI_Speed_H << 8)+ANI_Speed_L;
	//ANI_Speed=500;
	
 //	printf("ANI_Speed: %u\n",SectorNum);
	
	POS=568-1;
	SectorNum=POS;
	puts("启动...");
	
	while (MMCInit() != 0) puts(".");
	MMCInfo();
	if (read_VFAT_info()) { printf("-ERROR-");}
	while(1)
    {
	//   puts("正常工作");
	PLAY_ANI(ANI_END_POS,ANI_Speed);
//	vvv=((25600/1023)*(ADCH*256+ADCL))/1000;//数据计算
//	vvvv=((25600/1023)*(ADCH*256+ADCL))/1000;//数据计算
	putchar(ADCH);
	putchar(ADCL);
       if (NewData == TRUE)
         {
		  		   switch(RxBuffer[1])                      //判断功能号
				   {

			   		case 0x52://R
						 	//printf("SectorNum: %u\n",SectorNum);
					//		Delay(100);
								PLAY_ANI(ANI_END_POS,ANI_Speed);	
							//		   PLAY_ANI();
									break;
						case 0x53://S
 					 		 	 {FileCount = Search_File(0xFFFF);
  								// printf("TXTFileCount: %u\n",FileCount);		
								 			 if (fn != Search_File(fn))
								 			 {
								 			 }
											 FileSize = (unsigned long)DataBuff[28+64] + ((unsigned long)DataBuff[29+64]<<8)
												  + ((unsigned long)DataBuff[30+64]<<16) + ((unsigned long)DataBuff[31+64]<<24);
										//	 printf("FileSize is: %u\n",FileSize);
//											 FileName = &DataBuff[64];
								//			 printf("FileName is:\n");
											 for (x=64;x<71;x++) putchar(DataBuff[x]);putchar('.');
											 for (x=72;x<75;x++) putchar(DataBuff[x]);
											 
								break;}
						case 0x54://T
								r = play_music(PlayMusic);
								break;
						case 0x57://W
								 {SectorNum = (((RxBuffer[2])-0x30) * 10000) +(((RxBuffer[3])-0x30) * 1000) +(((RxBuffer[4])-0x30) * 100) +(((RxBuffer[5])-0x30) * 10) + (RxBuffer[6]-0x30);
								 MMCReadSector((unsigned long)SectorNum,&DataBuff[0]);
								 for (x=0;x<512;x++) putchar(DataBuff[x]);
								 
								 DisPlay();
								 
								 break;}
						case 0x50://P
								 {
								 SectorNum = (((RxBuffer[2])-0x30) * 10000) +(((RxBuffer[3])-0x30) * 1000) +(((RxBuffer[4])-0x30) * 100) +(((RxBuffer[5])-0x30) * 10) + (RxBuffer[6]-0x30);
								 for (x=0;x<SectorNum;x++) 
								 {
								 MMCReadSector((unsigned long)x+568,&DataBuff[0]);//128M MMC
//								 MMCReadSector((unsigned long)x+552,&DataBuff[0]);//32M  MMC
								 DisPlay();
								 }
								 break;}
							 	
   					}
         NewData = FALSE;
		// x=0;
         }
       }
}
//ADC完成中断
#pragma interrupt_handler adc_isr:15     
void adc_isr(void)
{
 ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0);
 ADCSRA|=(1<<ADSC);//启动AD转换
}


#pragma interrupt_handler uart1_rx_isr:12 
void uart1_rx_isr(void)
{
static char *Ptr = &RxBuffer[0];
unsigned char ch;

ch = UDR;//ATmega8L
if (Ptr > &RxBuffer[100]) Ptr = &RxBuffer[0];

if (ch == '<') Ptr = &RxBuffer[0];
 *Ptr++ = ch;
if (ch == '>') NewData = TRUE;
}

//**************************************
// void Delay_1ms(void)
//**************************************

void Delay_1ms(int Del)
{
int i;

while (Del--)
     {
     for (i=0;i<2000;i++) ;//WDR();
     }
}

/*************************************************************
 * MMC Init function
 *
 * - flushes card receive buffer
 * - selects card
 * - sends the reset command
 * - sends the initialization command, waits for card ready
 *************************************************************/
int MMCInit(void)
{
unsigned int i;
unsigned char Byte;

SPIDDR = SCLK + MOSI + CS ;//+ MMCPOWER;
SPIPORT = 0x00;
Delay_1ms(500);
//SPIPORT |= MMCPOWER;

⌨️ 快捷键说明

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