📄 c8051freadgt21.c
字号:
void Timer0_Init (void);
void SPI0_Init (void);
void SPI_ReadZiku (long ADD,unsigned char ReadByteNum,unsigned char *DataBuffer);
#i nclude "config.h"
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define TRUE 1
#define FALSE 0
#define EE_SIZE 4096 // EEPROM size in bytes
#define EE_READ 0x03 // EEPROM Read command
#define EE_WRITE 0x02 // EEPROM Write command
#define EE_WRDI 0x04 // EEPROM Write disable command
#define EE_WREN 0x06 // EEPROM Write enable command
#define EE_RDSR 0x05 // EEPROM Read status register
#define EE_WRSR 0x01 // EEPROM Write status register
sbit SPI_CS=P2^1;
//-----------------------------------------------------------------------------
// SPI0_Init
//-----------------------------------------------------------------------------
//
// Configure SPI0 for 8-bit, 2MHz SCK, Master mode, polled operation, data
// sampled on 1st SCK rising edge.
//
void SPI0_Init (void)
{
SPI0CFG = 0x40; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CN = 0x01; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/1000000; // SPI clock <= 2MHz (limited by
// EEPROM spec.)
}
//-----------------------------------------------------------------------------
// Timer0_Init
//-----------------------------------------------------------------------------
//
// Configure Timer0 for 16-bit interrupt mode.
//
void Timer0_Init (void)
{
TCON &= ~0x30; // STOP Timer0 and clear overflow flag
TMOD &= ~0x0f; // configure Timer0 to 16-bit mode
TMOD |= 0x01;
CKCON |= 0x04; // Timer0 counts SYSCLKs
}
//-----------------------------------------------------------------------------
// Timer0_ms
//-----------------------------------------------------------------------------
//
// Configure Timer0 to delay <ms> milliseconds before returning.
//
/*
void Timer0_ms (unsigned ms)
{
unsigned i; // millisecond counter
TCON &= ~0x30; // STOP Timer0 and clear overflow flag
TMOD &= ~0x0f; // configure Timer0 to 16-bit mode
TMOD |= 0x01;
CKCON |= 0x04; // Timer0 counts SYSCLKs
for (i = 0; i < ms; i++) { // count milliseconds
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = -SYSCLK/1000;
TR0 = 1; // START Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
}
}
*/
//-----------------------------------------------------------------------------
// Timer0_us
//-----------------------------------------------------------------------------
//
// Configure Timer0 to delay <us> microseconds before returning.
//
void Timer0_us (unsigned us)
{
unsigned i; // millisecond counter
TCON &= ~0x30; // STOP Timer0 and clear overflow flag
TMOD &= ~0x0f; // configure Timer0 to 16-bit mode
TMOD |= 0x01;
CKCON |= 0x04; // Timer0 counts SYSCLKs
for (i = 0; i < us; i++) { // count microseconds
TR0 = 0; // STOP Timer0
TH0 = (-SYSCLK/1000000) >> 8; // set Timer0 to overflow in 1us
TL0 = -SYSCLK/1000000;
TR0 = 1; // START Timer0
while (TF0 == 0); // wait for overflow
TF0 = 0; // clear overflow indicator
}
}
//函数参数说明
//ADD——要读的字模的起始地址
//ReadByteNum——要读取的字模的长度
//DataBuffer——读出的字模存放的地址
void SPI_ReadZiku (long ADD,unsigned char ReadByteNum,unsigned char *DataBuffer)
{
unsigned char i;
SPI_CS = 0; // select EEPROM
Timer0_us (1); // wait at least 250ns (CS setup time)
// transmit Read operate
SPIF = 0;
SPI0DAT = 3;
while (SPIF == 0);
// transmit WRITE opcode
SPIF = 0;
SPI0DAT = (ADD>>16);
while (SPIF == 0);
SPIF = 0;
SPI0DAT = (ADD>>8);
while (SPIF == 0);
SPIF = 0; // transmit LSB of address
SPI0DAT = ADD;
while (SPIF == 0);
for(i=0;i<ReadByteNum;i++)
{
// initiate dummy transmit to read data
SPIF = 0;
SPI0DAT = 0;
while (SPIF == 0);
*(DataBuffer+i) = SPI0DAT; // read data from SPI
}
SPI_CS = 1; // select EEPROM
Timer0_us (1); // wait at least 250ns (CS setup time)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -