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

📄 c8051freadgt21.c

📁 c8051f 通过SPI读取GT21字库
💻 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 + -