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

📄 main.c

📁 ISD1700语音芯片放音的ISP实现
💻 C
字号:
#include <iom64v.h>
#include <macros.h>
#include <string.h>
#include "timer.h"
#include "main.h"

unsigned int iProgRunCount=0;
unsigned int soundTime=0;
unsigned char data1,data2,data3,data4;

// 端口初始化函数
void Port_Init(void)
{
    PORTA = 0x00;
    DDRA = 0x00;
    PORTB = 0x01;
    DDRB = 0xE7;
    PORTC = 0x00;
    DDRC = 0x00;
    PORTD = 0x00;
    DDRD = 0xC0;
    PORTE = 0x00;
    DDRE = 0x00;
    PORTF = 0x00;
    DDRF = 0x00;
    PORTG = 0x00;
    DDRG = 0x00;
}

//SPI initialize
// clock rate: 1000000hz
void spi_init(void)
{
    //int i;
    SPCR = 0x7e; //setup SPI
    SPSR = 0x00; //setup SPI
    PORTB |= (1<<PB0);	//SS=1
}

//call this routine to initialise all peripherals
void init_devices(void)
{
    //unsigned char temp=0;
    //stop errant interrupts until set up
    CLI(); //disable all interrupts
    XDIV = 0x00; //xtal divider
    XMCRA = 0x40; //external memory
    Port_Init();
    watchdog_init();
    timer1_init();
    spi_init();

    MCUCR = (1 << SRE); //0x80,外部存储使能
    //EICRA:外部中断3-0敏感电平控制BIT7--0:ISC31|ISC30......ISC01|ISC00
    //ISCn1|ISCn0:00-低电平触发,01-保留,10-下降沿触发,11-上升沿触发
    EICRA = 0x02;
    //EICRB:外部中断7-4敏感电平控制BIT7--0:ISC71|ISC70......ISC41|ISC40
    //ISCn1|ISCn0:00-低电平触发,01-任意逻辑电平变化,10-两次采用发生下降沿就触发,11-两次采用发生上升沿就触发
    EICRB = 0x00;
    EIMSK = 0x01; //外部中断屏蔽寄存器BIT7--0:INT7--INT0,1使能0关闭
    //TIMSK:定时器中断屏蔽寄存器BIT7--0:OCIE2|TOIE2|TICIE1|OCIE1A|OCIE1B|TOIE1|OCIE0|TOIE0
    TIMSK = (1 << TOIE1); //0x04
    //ETIMSK:扩展定时器中断屏蔽寄存器BIT7--0:--|--|TICIE3|OCIE3A|OCIE3B|TOIE3|OCIE3C|OCIE1C
    ETIMSK = 0x00; //(1<<TOIE3);	//0x04
    SEI(); //re-enable interrupts
    //all peripherals are now initialised
}

void isd1700_init(void)
{
	int i;
	for(i=0;i<=100;i++);
    //芯片上电
	PORTB &= ~(1<<PB0);	//SS=0
    for(i=0;i<100;i++)
    	;
    SPDR = 0x10+0x01;
    while (!(SPSR &(1 << SPIF)))
        ;
	SPDR = 0x00;
    while (!(SPSR &(1 << SPIF)))
        ;
	for(i=0;i<100;i++)
    	;
    PORTB |= (1<<PB0);	//SS=1
    for(i=0;i<=100;i++);
    //设置APC寄存器
    PORTB &= ~(1<<PB0);	//SS=0
    for(i=0;i<100;i++)
    	;
    SPDR = 0x10+0x45;
    while (!(SPSR &(1 << SPIF)))
        ;
	SPDR = 0x40;
    while (!(SPSR &(1 << SPIF)))
        ;
    SPDR = 0x0c;
    while (!(SPSR &(1 << SPIF)))
        ;
	PORTB |= (1<<PB0);	//SS=1
    for(i=0;i<=100;i++);
}

void Read_APC(void)
{
	int i;
    PORTB &= ~(1<<PB0);	//SS=0
    for(i=0;i<100;i++)
    	;
    SPDR = 0x10+0x44;
    while (!(SPSR &(1 << SPIF)))
        ;
	data1=SPDR;
    SPDR = 0x00;
    while (!(SPSR &(1 << SPIF)))
        ;
	data2=SPDR;
	SPDR = 0x00;
    while (!(SPSR &(1 << SPIF)))
        ;
	data3=SPDR;
	SPDR = 0x00;
    while (!(SPSR &(1 << SPIF)))
        ;
	data4=SPDR;
	
	if(data4==0x0c)
		RUN2_ON();
        
	for(i=0;i<100;i++)
    	;
    PORTB |= (1<<PB0);	//SS=1
}

void Sound_Flay(void)
{
    int i;
    PORTB &= ~(1<<PB0);	//SS=0
    for(i=0;i<100;i++)
    	;
    SPDR = 0x10+0x40;
    while (!(SPSR &(1 << SPIF)))
        ;
	data1=SPDR;
    SPDR = 0x00;
    while (!(SPSR &(1 << SPIF)))
        ;
	data2=SPDR;
        
	for(i=0;i<100;i++)
    	;
    PORTB |= (1<<PB0);	//SS=1
}

void Sound_SetFlay(unsigned int startAdd)
{
    int i;
    PORTB &= ~(1<<PB0);	//SS=0
    for(i=0;i<100;i++)
    	;
    SPDR = 0x10+0x80;					//cmd
    while (!(SPSR &(1 << SPIF)))
        ;
    SPDR = 0x00;					//data
    while (!(SPSR &(1 << SPIF)))
        ;
	SPDR = (unsigned char)startAdd;	//start add,LSB
    while (!(SPSR &(1 << SPIF)))
        ;
	SPDR = (unsigned char)(startAdd>>8);	//start add,MSB
    while (!(SPSR &(1 << SPIF)))
        ;
	SPDR = 0x00;					//end add
    while (!(SPSR &(1 << SPIF)))
        ;
    SPDR = 0x00;					//end add
    while (!(SPSR &(1 << SPIF)))
        ;
    SPDR = 0x00;					//end add
    while (!(SPSR &(1 << SPIF)))
        ;
	for(i=0;i<100;i++)
    	;
    PORTB |= (1<<PB0);	//SS=1
}

//主函数
void main(void)
{
    static unsigned char secondcount=0;
    unsigned char soundFlag=0;
    
    unsigned int t;
    
    init_devices(); //全局初始化
    RUN2_OFF();
    
    iProgRunCount=GetTime();
    while(1)
    {
    	WDR();
    	t=GetPassTime(iProgRunCount);
		if(t>=100)
		{
			isd1700_init();
			break;
		}
    }
    
    Read_APC();

	Sound_SetFlay(0x10);
	soundTime=GetTime();
    while (1)
    {
        WDR(); //内部watchdog
		if(GetPassTime(soundTime)>=1000)
        {
        	soundTime=GetTime();
        	secondcount++;
        	if(secondcount>=20)
        	{
        		secondcount=0;
        		soundFlag=1;
        	}
        	RUN1();
        }
        
        if(soundFlag)
        {
        	soundFlag=0;
        	//Sound_Flay();
        	Sound_SetFlay(0x10);
        }
    }
}

⌨️ 快捷键说明

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