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

📄 procyon.c

📁 AVR mp3 embedded program code support IDE with FAT16
💻 C
📖 第 1 页 / 共 2 页
字号:
//*****************************************************************
//
// File Name	: 'procyon.c'
// Title		: Procyon MP3 player main
// Author		: Pascal Stang
// Date			: 11/22/2000
// Version		: 0.1
// Target MCU	: ATmega103
// Editor Tabs	: 3
//
//*****************************************************************


//#define AVR_AT90S8515
#define AVR_ATMEGA103

#ifndef WIN32
	#include <io.h>
	#include <signal.h>
	#include <interrupt.h>
#endif

#include "global.h"
#include "lcd.h"
#include "systimer.h"
#include "uart.h"
#include "i2c.h"
#include "spi.h"
#include "sta013.h"
#include "ata_if.h"
#include "playmgr.h"

//#include "procyon.h"

// function prototypes
void mainInitPorts(void);
void mainLCDtest(void);
void mainHDItest(void);
void mainSTA013test1(void);
void mainSTA013test2(void);
void mainLoadToBuffer(void);
void mainPlayFromBuffer(void);
void mainLoadToDisk(void);
void mainPlayFromDisk(void);
void mainPlayFromDisk2(void);
void mainDumpFromDisk(void);
void mainInitDecoder(void);



void mainInitPorts(void)
{
	// general configuration - safe all ports
	outp(0x00, DDRA);			// initialize PortA to input
	outp(0xFF, DDRB);			// initialize PortB to input
	//outp(0x00, DDRC);			// initialize PortC to input
	outp(0x00, DDRD);			// initialize PortD to input
	outp(0x00, DDRE);			// initialize PortE to input

	// specific configuration

	// STA013 data request
	cbi(STA013_DEMAND_PORT-1,STA013_DEMAND_PIN);	// set demand pin as input 

}

int main(void)
{
	unsigned int i;
	unsigned int j;
	unsigned char run;
	unsigned char s,r;

	//outp(0x7D, XDIV);			// set division ratio F_CPU/(129-d)
	//outp(0x7F, XDIV);			// set division ratio F_CPU/(129-d)
	//sbi(XDIV, XDIVEN);		// enable clock division

	mainInitPorts();				// initialize I/O ports
	timerInit0();				// initialize and start timebase
	uartInit();					// initialize uart
	i2c_init();					// initialize I2C interface
	spiInit();					// initialize spi interface
	ataInit();					// initialize ATA driver

	sbi(MCUCR, SRE);			// enable RAM interface

	timerPause(200);			// wait for hardware get up and running

	lcdInit();					// initialize LCD

	timerPause(200);			// wait for hardware get up and running

	lcdGotoXY(0,0); lcdPrintStr("--- Procyon MP3  ---");

	i = 0;
	j = 0;
	s = 0;
	r = 0;

	uartPrintStr("\r\n\n--- Procyon MP3  ---\r\n");
	//uartSendBuffer("Procyon MP3\n\r",13);
	uartPrintStr("Press ""?"" for help.\r\n");

	run = TRUE;

	while(run)
	{
		// print prompt
		uartPrintStr("\r\nProcyon MP3>");

		while(!uartReceiveByte(&s));
		uartPrintChar(s);
		uartPrintStr("\r\n\n");
		switch(s)
		{
		case '1':
			mainSTA013test1();
			break;
		case '2':
			mainPlayFromDisk2();
			break;
		case 'd':
			mainLCDtest();
			break;
		case 'h':
			mainHDItest();
			break;
		case 'i':
			mainInitDecoder();
			break;
		case 'k':
			mainLoadToBuffer();
			break;
		case 'l':
			mainLoadToDisk();
			break;
		case 'q':
			mainPlayFromBuffer();
			break;
		case 'p':
			mainPlayFromDisk();
			break;
		case 'u':
			mainDumpFromDisk();
			break;
		case '?':
			uartPrintStr("Commands:\r\n");
			uartPrintStr("(h) hard disk test\r\n");
			uartPrintStr("(d) lcd display test\r\n");
			uartPrintStr("(1) mp3 decoder test from serial port\r\n");
			uartPrintStr("(i) mp3 decoder initialize\r\n");
			uartPrintStr("(k) load data into buffer from serial port\r\n");
			uartPrintStr("(q) play mp3 from buffer\r\n");
			uartPrintStr("(l) load data into disk from serial port\r\n");
			uartPrintStr("(p) play mp3 from disk\r\n");
			uartPrintStr("(2) play mp3 from disk v2\r\n");
			uartPrintStr("(u) dump mp3 from disk to serial port (binary)\r\n");
			uartPrintStr("(?) for help\r\n");
			uartPrintStr("(e)xit\r\n");
			break;
		case 'e':
			uartPrintStr("Exiting...\r\n");
			run = FALSE;
			break;
		default:
			uartPrintStr("Unknown command\r\n");
			break;
		}
	}

	cbi(MCUCR, SRE);			// disable RAM interface

	return 0;
}

void mainLCDtest(void)
{
	u08 i,j;

	while(1)
	{
		lcdHome();
		for(j=0; j<9; j++)
		{
			timerPause(500);
			for(i=0; i<80; i++)
			{
				lcdDataWrite(0x30+((i+j)%10));
				outp(~i,PORTB);
			}
		}
	}
}

void mainSTA013test1(void)
{
	unsigned int i,j;
	unsigned char s;
	u32 bytesRead;

	i = 0;
	j = 0;

	lcdGotoXY(0,1); lcdPrintStr("Init STA013...      ");

	if(sta013Init())
	{
		lcdGotoXY(0,2); lcdPrintStr("No STA013           ");
		timerPause(2000);
	}
	else
	{
		lcdGotoXY(0,2); lcdPrintStr("STA013 OK          ");
		timerPause(2000);
	}
	sta013ResumeDecoder();

	//sta013HWReset();
	while(j != STA_IDENT)
	{
		j = sta013ReadReg(STA_REG_IDENT);
		lcdGotoXY(0,3); lcdPrintStr("STA013 ID: 0x"); lcdPrintfu08(j);
	}

	lcdGotoXY(0,2); lcdPrintStr("Bytes read:         ");

	cbi(DDRB, 7);	// set PB7 as input 

	bytesRead = 0;
	i = 0;

	while(1)
	{
		if(bit_is_set(PINB,PB7))
		{
			// data request high
			while(!uartReceiveByte(&s));
			spiSendByte(s);
			bytesRead++;
			lcdGotoXY(0,3);
			lcdPrintfu32(bytesRead);
			lcdPrintStr(" *");
			//lcdPrintfu32(TimeReg1);
			//lcdDataWrite(s);
			sbi(PORTB, PB6);
			//if(i)
			//{
			//	uartSendByte(1);
			//	i = 0;
			//}
		}
		else
		{
			// data request low
			lcdGotoXY(0,3);
			lcdPrintfu32(bytesRead);
			lcdPrintStr("  ");
			cbi(PORTB, PB6);
			//uartSendByte(2);
			//i = 1;
		}
	}

}

void mainInitDecoder(void)
{
	// initialize the mp3 decoder
	lcdGotoXY(0,1); lcdPrintStr("Init STA013...      ");
	uartPrintStr("Init STA013...\r\n");


	if(sta013Init())
	{
		lcdGotoXY(0,1); lcdPrintStr("No STA013           ");
		uartPrintStr("No STA013\r\n");
		timerPause(2000);
	}
	else
	{
		lcdGotoXY(0,1); lcdPrintStr("STA013 OK          ");
		uartPrintStr("STA013 OK\r\n");
		timerPause(2000);
	}
	sta013ResumeDecoder();
	uartPrintStr("Done!\r\n");
}

void mainLoadToBuffer(void)
{
	unsigned int i,j;
	unsigned char s;
	unsigned char *buffer;
	unsigned char *subbuffer;
	u32 LBAsector;
	u32 bytesRead;

	bytesRead = 0;

	i = 0;
	j = 0;

	// print intro message
	uartPrintStr("Load MP3 data into buffer via serial port\r\n");

	// setup our local buffer pointing to the big one
	buffer = (unsigned char*) MP3PLAY_BUFFER_ADDR;

	lcdGotoXY(0,1); lcdPrintStr("Bytes read:         ");
	bytesRead = 0;
	uartPrintStr("Ready for MP3 data...\r\n");

	// fill up the play buffer
	for(i=0; i < MP3PLAY_BUFFER_SIZE; i++)
	{
		// get data from serial port
		while(!uartReceiveByte(&s));
		// store to buffer
		buffer[i] = s;
		// do some stats
		bytesRead++;
		lcdGotoXY(0,2); lcdPrintfu32(bytesRead);
		//lcdGotoXY(0,3); lcdPrintfu32(j);
	}

	// store to disk just for fun
/*	uartPrintStr("Store to disk just for fun...\r\n");
	LBAsector = 0x00000001;
	uartPrintfu16((int) buffer);
	uartPrintStr("\r\n");
	for(j=0; j<(MP3PLAY_BUFFER_SIZE>>9); j++)
	{
		subbuffer = (buffer+(j*512));
		uartPrintStr("Storing sector");
		uartPrintfu16(j);
		uartPrintStr("\r\n");
		uartPrintfu16((int) subbuffer);
		uartPrintStr("\r\n");
		ataWriteSectorsLBA(0, LBAsector+j, 1, subbuffer );
	}

	//ataWriteSectorsLBA(0, LBAsector, 0x20, buffer );
*/
	uartPrintStr("\r\nDone Loading...\r\n");
	timerPause(4000);
	uartPrintStr("Flushing Receive Buffer\r\n");
	uartFlushReceiveBuffer();

}

void mainPlayFromBuffer(void)
{
	unsigned int i,j;

	i = 0;
	j = 0;
	
	// print intro message
	uartPrintStr("Play MP3 data from buffer\r\n");

	uartPrintStr("Initializing play manager\r\n");

	// initialize the play manager and buffers
	playmgrInit();
	// set play index to beginning of buffer
	PlayBuffer.dataindex = 0;

	// go to play
	lcdGotoXY(0,1); lcdPrintStr("Play:               ");

	uartPrintStr("Start Play...\r\n");
	playmgrStart();
	while(PlayBuffer.dataindex < PlayBuffer.size-0x80)
	{
		lcdGotoXY(0,2); lcdPrintfu32(PlayBuffer.dataindex);
		lcdGotoXY(0,3); lcdPrintfu32(j);
	}
	playmgrStop();
	uartPrintStr("Done!\r\n");
}

void mainLoadToDisk(void)
{
	unsigned int i,j;
	unsigned char s;
	unsigned char *buffer;
	u32 LBAsector;
	u32 bytesRead;

	i = 0;
	j = 0;

	// print intro message
	uartPrintStr("Load MP3 data into disk via serial port\r\n");

	// setup our local sector buffer
	buffer = (unsigned char*) SECTOR_BUFFER_ADDR;

	lcdGotoXY(0,1); lcdPrintStr("Bytes read:         ");
	bytesRead = 0;
	uartPrintStr("Ready for MP3 data...\r\n");

	// initialize LBA sector
	LBAsector = 0x00010000;

	// fill up 32 sectors
	for(j=0; j<0x040; j++)
	{
		// fill up a sector buffer
		for(i=0; i<0x200; i++)
		{
			// get data from serial port
			while(!uartReceiveByte(&s));
			// store to buffer
			buffer[i] = s;
			// do some stats
			bytesRead++;
			lcdGotoXY(0,2); lcdPrintfu32(bytesRead);
			//lcdGotoXY(0,3); lcdPrintfu32(j);

⌨️ 快捷键说明

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