📄 isd4004.c
字号:
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
#define SYSCLK 11059200
#define CHIP_SELECT CS=0, _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_();
#define CHIP_NOSELECT CS=1, _nop_(), _nop_(), _nop_(), _nop_(), _nop_(), _nop_(),_nop_(), _nop_(), _nop_();
sbit CS = P2^0;
unsigned int Count1msInc;
void SPIWrOne(unsigned char ch)
{
SPIF = 0;
SPI0DAT = ch;
while (SPIF == 0); // wait for data transfer to be completed
}
void SPIWrThree(unsigned char addl, unsigned char addh, unsigned char COM)
{
unsigned char i;
CHIP_SELECT;
i = addl;
SPIWrOne(i);
i = addh;
SPIWrOne(i);
i = COM;
SPIWrOne(i);
CHIP_NOSELECT;
}
/*
unsigned char GetSPIByte(void)
{
SPIF = 0;
SPI0DAT = 0;
while (SPIF == 0);
return SPI0DAT; // read data from SPI
}
*/
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 11.0592MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
}
void PORT_Init (void)
{
XBR0 = 0x06; // Enable SMBus, SPI0, and UART0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
//P0MDOUT = 0x15;
}
void SPI0_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG|=0xC0; //CKPOL =1;
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
//SPI0CKR = SYSCLK/2/2000000-1; // SPI clock <= 8MHz (limited by
// EEPROM spec.)
SPI0CKR = SYSCLK/2/8000-1; // SPI clock <= 8MHz (limited by
}
void Timer0_Init (void)
{
CKCON|=0x8;
TMOD|=0x1; //16Bit
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
IE|= 0x2;
}
void Timer0_ISR (void) interrupt 1 //1ms
{
TH0 = (-SYSCLK/1000) >> 8;
TL0 = -SYSCLK/1000;
Count1msInc++;
}
void Delay_ms(unsigned char Val_ms)
{
Count1msInc=0;
TR0 =1;
while((Count1msInc<Val_ms)==1);
TR0 =0;
}
void Delay_s(unsigned char Val_s)
{
unsigned int temp;
temp = Val_s*1000;
Count1msInc=0;
TR0 =1;
while((Count1msInc<temp)==1);
TR0 = 0;
}
void main (void)
{
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init (); // initialize oscillator
Timer0_Init();
PORT_Init (); // initialize crossbar and GPIO
SPI0_Init (); // initialize SPI0
EA = 1;
while(1)
{
SPIF = 0;
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(50); //延时25ms
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(50); //延时25ms
SPIWrThree(0x00,0x01,0x05); //设置录音起始地址为0100h
Delay_ms(50); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0d); //连续录音
CHIP_NOSELECT;
Delay_s(10); //延时15s
CHIP_SELECT;
SPIWrOne(0x0c); //停止录音
CHIP_NOSELECT;
Delay_ms(50); //延时15s
CHIP_SELECT;
SPIWrOne(0x04); //上电
CHIP_NOSELECT;
Delay_ms(50); //延时25ms
SPIWrThree(0x00,0x01,0x07); //设置放音起始地址为0100h
Delay_ms(50); //延时25ms
CHIP_SELECT;
SPIWrOne(0x0f); //放音
CHIP_NOSELECT;
Delay_s(10); //延时15s
CHIP_SELECT;
SPIWrOne(0x0c); //停止录音
CHIP_NOSELECT;
_nop_();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -