MAX7219产品级驱动分享

在2008年开发的红酒自动售卖机上用MAX7219实现8个4位LED显示,一直稳定运行,今天由于要修改一下红酒机的代码,特此分享下MAX7219的驱动。

MAX7219.h

/*
*********************************(C) COPYRIGHT 2008 HB **************************************************
*
* File Name          : sp_max7219.h
* Author             : qzm
* Date First Issued  :  11/28/2008 qzm
* Description        : Header for spi_max7219.c file.
*
* History:
* 2009/02/19: V2.0 begin
* 待增加的功能如下:
* (1)每个4位LED可单独寻址修改
* (2)增加单个4位LED闪烁功能
* (3)增加可显示英文字符的功能
*
* 2009/01/04: V1.0
* (1)实现了4个MAX7219控制8个4位共阴极LED显示驱动,每个4位LED对应0000-9999的整数。
* (2)先调用IniFourMax7219 fun ini SPI and Max7219的工作模式,然后用
Max7219_SendFourWord FUN 发送形如 d[0] d[1] d[2] d[3] d[4] d[5] d[6] d[7]
*										1234 5678 1234 5678 1234 5678 1234 5678 
*                                       LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8
* 在该版本中的发送函数中并没有加入延时之类的代码,运行很稳定。
*
* 2008/11/28: beta1
--------------------------------------------------------------------------------------------------------
*								  Version2.0 Debug Sum-up
(1)在初始化 Mcu's SPI Module 后要延迟一定的时钟周期后再发送初始化数据给MAX7219
如:	Max7219_Init();
for (i=0;i<999999;i++); // Delay, 必要条件,当 i<9时,初始化出错的机率达到90%
// 当注释掉 延迟,初始化出错机率为100%
SendDataToFirstMax7219(REG_DECODE, DECODE_MODE_BCD_FOR_ALL_DIGIT);	

NOTE: 在之后的调试中发现,(1)中的分析是错误的,在初始化SPI后,立即发送数据是可行的,
而(1)中的错误假象是由于没在拉高( SPI_NSS_HIGH())之前检查数据是否发送完毕所致。

KeyPoint:
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_NSS_HIGH();

(2)
在发送数据之前要查看忙状态标志,QZM不会忽略
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, temp1);
!!!!! 在置高之前也要查看忙状态标志,QZM忽略着 !!!!!
这会使本是要发送给第一个MAX7219却发给了第4个MAX7219,发送给第二个却发给了第三个,发给
第四个却发给了第一个。
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_NSS_HIGH();

(3) 在看FWLIB2.03's example 发现很多SPI的例子用
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); 
而之前我一直用
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
也工作得很好,为了比较,把基于 SPI_I2S_FLAG_BSY 改为 SPI_I2S_FLAG_TXE ,正在测试较果

2009/2/23 !!!!! << 关于 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); 和  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 的实测比较>>

用SPI_I2S_FLAG_TXE == RESET 来控制发送,在 SPI_BaudRatePrescaler_256 - SPI_BaudRatePrescaler_2 时4个MAX7219
的显示都不正常,在调节分频为SPI_BaudRatePrescaler_2时,第一个MAX7219显示正常,其他的MAX7219显示不正常,但当转其他的
SPI_BaudRatePrescaler_X,4个MAX729的显示大都不正常。

代码如下所示:(不加任何延时)
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, NULL_OP);

用 while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); 来控制发送,在SPI_BaudRatePrescaler_2 时只有第一个MAX7219显示正常,其他MAX7219显示不正常
但,SPI_BaudRatePrescaler_4 - SPI_BaudRatePrescaler_256 4个MAX7219都显示正常。

<< 结论 >> 用while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);而不是用SPI_I2S_FLAG_TXE == RESET,来控制MAX7219的发送更加稳定!!!!!

(4)经过几天的改MAX7219底层代码和测试的心得 - 2009/2/23
1、当SPI的预分频为“SPI_BaudRatePrescaler_2”时,无论PLC板上的22R或RC滤波使能与否,都只有第一个MAX7219能正常工作,其他三个都不能
    因此只能用“SPI_BaudRatePrescaler_4”以上的预分频。

2、while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);比while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    用于控制SPI发送数据给MAX7219稳定得多。

*********************************************************************************************************
*/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef MAX7219_H
#define MAX7219_H

/* Includes ------------------------------------------------------------------*/

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/

#define SPI_NSS_LOW()     GPIO_ResetBits(GPIOA, GPIO_Pin_4)		/* Select SPI FLASH: ChipSelect pin low  */
#define SPI_NSS_HIGH()    GPIO_SetBits(GPIOA, GPIO_Pin_4)		/* Deselect SPI FLASH: ChipSelect pin high */

/* Exported functions ------------------------------------------------------- */

/*----- Version 1.0 use -----------------------------*/
/*----- High layer function -----*/
void IniFourMax7219(void);
void SPI_Max7219_SendFourWord(s32* pEightLedData);
/*----- Low layer function -----*/


/*----- Version 2.0 use -----------------------------*/
/*----- 2009-2-20 new add ------*/
void IniMax7219s(void);                             // 把PLC板上的4个MAX7219初始化为No decode for digits7-0;

void MAX7219_CloseAllLedDisplay(void);
void MAX7219_OpenAllLedDisplay(void);

void MAX7219_Send4BitNum(u8 LedIndex, u16 data);		// 发送 十进制的   0000-9999; 当data >= 0xF000时,表示要显示其他编码 

void MAX7219_Send4BitDark(u8 LedIndex);					// 使指定LED全     DARK
void MAX7219_Send4BitLow(u8 LedIndex);					// 使指定LED显示   "____"
void MAX7219_Send4BitMiddle(u8 LedIndex);				// 使指定LED显示   "----"
void MAX7219_Send4BitHeight(u8 LedIndex);				// 使指定LED显示   "~~~~"

void MAX7219_IntensityAdjust(u8 MAX7219Index, u8 IntensityValue/* 0x00-0x0F */); // 亮度调整

/*----- Low layer function -----*/
u8 MAX7219_LedBitCoding(u8 data);					// 把输入字节转换为MAX7219能处理的编码

void MAX7219_SendDataToFirstMax7219(u8 Reg, u8 data);	// 发送数据到第一个MAX7219的指定寄存器中,可用于初始化MAX7219和数据显示
void MAX7219_SendDataToSecMax7219(u8 Reg, u8 data);		// 发送数据到第二个MAX7219的指定寄存器中,可用于初始化MAX7219和数据显示
void MAX7219_SendDataToThirdMax7219(u8 Reg, u8 data);	// 发送数据到第三个MAX7219的指定寄存器中,可用于初始化MAX7219和数据显示
void MAX7219_SendDataToFourMax7219(u8 Reg, u8 data);	// 发送数据到第四个MAX7219的指定寄存器中,可用于初始化MAX7219和数据显示

#endif /* MAX7219_H */

/******************* (C) HB 2008/11/21 qzm *****END OF FILE********************************************/

MAX7219.c

/*
*********************************(C) COPYRIGHT 2008 HB **************************************************
*
* File Name          : sp_max7219.h
* Author             : qzm
* Date First Issued  :  11/28/2008 qzm
* Description        : Header for spi_max7219.c file.
*
* History:
* 2009/02/19: V2.0 begin
* 待增加的功能如下:
* (1)每个4位LED可单独寻址修改
* (2)增加单个4位LED闪烁功能
* (3)增加可显示英文字符的功能
*
* 2009/01/04: V1.0
* (1)实现了4个MAX7219控制8个4位共阴极LED显示驱动,每个4位LED对应0000-9999的整数。
* (2)先调用IniFourMax7219 fun ini SPI and Max7219的工作模式,然后用
* SPI_Max7219_SendFourWord FUN 发送形如 d[0] d[1] d[2] d[3] d[4] d[5] d[6] d[7]
*										1234 5678 1234 5678 1234 5678 1234 5678 
*                                       LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8
* 在该版本中的发送函数中并没有加入延时之类的代码,运行很稳定。
*
* 2008/11/28: beta1
--------------------------------------------------------------------------------------------------------
*								  Version2.0 Debug Sum-up
(1)在初始化 Mcu's SPI Module 后要延迟一定的时钟周期后再发送初始化数据给MAX7219
如:	SPI_Max7219_Init();
for (i=0;i<999999;i++); // Delay, 必要条件,当 i<9时,初始化出错的机率达到90%
// 当注释掉 延迟,初始化出错机率为100%
SPI_SendDataToFirstMax7219(REG_DECODE, DECODE_MODE_BCD_FOR_ALL_DIGIT);	

NOTE: 在之后的调试中发现,(1)中的分析是错误的,在初始化SPI后,立即发送数据是可行的,
而(1)中的错误假象是由于没在拉高( SPI_NSS_HIGH())之前检查数据是否发送完毕所致。

KeyPoint:
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_NSS_HIGH();

(2)
在发送数据之前要查看忙状态标志,QZM不会忽略
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, temp1);
!!!!! 在置高之前也要查看忙状态标志,QZM忽略着 !!!!!
这会使本是要发送给第一个MAX7219却发给了第4个MAX7219,发送给第二个却发给了第三个,发给
第四个却发给了第一个。
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_NSS_HIGH();

*********************************************************************************************************
*/


/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "MAX7219.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
//------------------------------------------------------------------------------
//  MAX7219 Register
//
#define		REG_DIGIT0				0x01		/* Digit 0 */
#define		REG_DIGIT1				0x02		/* Digit 1 */
#define		REG_DIGIT2				0x03		/* Digit 2 */
#define		REG_DIGIT3				0x04		/* Digit 3 */
#define		REG_DIGIT4				0x05		/* Digit 4 */
#define		REG_DIGIT5				0x06		/* Digit 5 */
#define		REG_DIGIT6				0x07		/* Digit 6 */
#define		REG_DIGIT7				0x08		/* Digit 7 */
#define    	REG_H					0x0C        /*   H     */
#define     REG_M					0x0A        /*   -     */
#define     REG_L					0x0D        /*   L     */

#define		REG_DECODE				0x09        /*译码方式寄存器            */
#define		REG_INTENSITY			0x0A        /*亮度寄存器                */
#define		REG_LIMIT				0x0B        /*扫描界限寄存器            */
#define		REG_SHUTDOWN			0x0C        /*停机寄存器                */
#define		REG_DISPTEST			0x0F        /*显示测试寄存器            */
#define		REG_NO_OP               0xF0		/*不进行操作寄存器          */

#define     DECODE_MODE_NO_DECODE       0x00
#define     DECODE_MODE_BCD_FOR_DIGIT0  0x01
#define     DECODE_MODE_BCD_FOR_DIGIT0_TO_DIGIT3 0x0F
#define     DECODE_MODE_BCD_FOR_ALL_DIGIT		 0xFF

#define		INTENSITY_1_32           0x00
#define		INTENSITY_3_32           0x01
#define		INTENSITY_5_32           0x02
#define		INTENSITY_7_32           0x03
#define		INTENSITY_9_32           0x04
#define		INTENSITY_11_32          0x05
#define		INTENSITY_13_32          0x06
#define		INTENSITY_15_32          0x07
#define		INTENSITY_17_32          0x08
#define		INTENSITY_19_32          0x09
#define		INTENSITY_21_32          0x0A
#define		INTENSITY_23_32          0x0B
#define		INTENSITY_25_32          0x0C
#define		INTENSITY_27_32          0x0D
#define		INTENSITY_29_32          0x0E
#define		INTENSITY_31_32          0x0F

#define     SCAN_LIMIT_DIG0			 0x00
#define     SCAN_LIMIT_DIG01		 0x01
#define     SCAN_LIMIT_DIG012		 0x02
#define     SCAN_LIMIT_DIG0123		 0x03
#define     SCAN_LIMIT_DIG01234		 0x04
#define     SCAN_LIMIT_DIG012345	 0x05
#define     SCAN_LIMIT_DIG0123456	 0x06
#define     SCAN_LIMIT_DIG01234567	 0x07

#define		SHUTDOWN_SHUTDOWN		 0x00
#define		SHUTDOWN_NORMAL			 0x01

#define		DISPLAY_TEST_NORMAL		 0x00
#define		DISPLAY_TEST_TEST		 0x01

//----- No-Decode Mode Data Bits and Corresponding Segment Lines ------------
//--------- Standard 7-Segment LED ---------------------
//                A
//               ___
//			  F |   | B
//              |_G_|
//				|   | 
//			  E	|___| C
//				  D     。DP
//--------- Register data ------------------------------
#define     LED_SEG_G                    0x01  /* D0 */
#define     LED_SEG_F                    0x02  /* D1 */
#define     LED_SEG_E                    0x04  /* D2 */
#define     LED_SEG_D                    0x08  /* D3 */
#define     LED_SEG_C                    0x10  /* D4 */
#define     LED_SEG_B                    0x20  /* D5 */
#define     LED_SEG_A                    0x40  /* D6 */
#define     LED_SEG_DP                   0x80  /* D7 */

//
// normal macro
//
#define     NULL_OP                 (u16)((REG_NO_OP<<8)&0xFF00)


/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void SPI_Max7219_Init(void);
void IniFourMax7219(void);
void SPI_Max7219_SendFourWord(s32* pEightLedData);

/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : SPI_Max7219_Init
* Description    : Initializes the peripherals used by the Max7219 driver.
* Input          : None
* Output         : None
* Return         : None
*
* 
* 2009/02/20 更改备注:
* (1)SPI_BaudRatePrescaler 之前一直设置为最保守的“SPI_BaudRatePrescaler_256”,
* 改为“SPI_BaudRatePrescaler_2”测试。
*******************************************************************************/
void SPI_Max7219_Init(void)
{
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	/* Enable SPI1 and GPIOA clocks */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);

	/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Configure PA.4 as Output push-pull, used as Flash Chip select */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* SPI1 configuration */ 
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b/*SPI_DataSize_8b*/;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;	 // ok
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // ok
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;// = SPI_NSS_Hard 时 MAX7219不能工作 !!!!!
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; /*  SPI_BaudRatePrescaler_2    只有第一个MAX7219正常,其他都不正常(无论是15元的还是5元)
																	        SPI_BaudRatePrescaler_4    在接4个5元的MAX7219S,极不稳定
																		    SPI_BaudRatePrescaler_32   改为:5元的, 不太稳定,有时某个LED会灭或全8888
																			SPI_BaudRatePrescaler_64   测试中
																		    SPI_BaudRatePrescaler_128  8个LED后面的显示有些延迟 */
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI1, &SPI_InitStructure);


	/* Enable SPI1 TXE interrupt */
	//SPI_I2S_ITConfig( SPI1, SPI_I2S_IT_TXE, ENABLE);

	/* Enable SPI1  */
	SPI_Cmd(SPI1, ENABLE);   

	/* 由于MAX7219在NSS的上升沿处开始锁存数据,所以在初始化MAX7219时先置为高,在传送数据之前,再置为低,当传送数据完成后再置高,
	即锁存入MAX7219*/
	SPI_NSS_HIGH();
}



/*******************************************************************************
* Function Name  : IniFourMax7219
* Description    : Initializes board Max7219 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IniFourMax7219(void)
{
	int i;
	u8 ucs[10] = { 	REG_DECODE,    0xFF, // 8个Digit都使能译码 0-8
		REG_INTENSITY, 0x06, // 25/32
		REG_LIMIT,     0x07, // 只扫描0-3 DIGIT
		REG_SHUTDOWN,  0x01, // (0)Shutdown Mode ; (1)Normal Operation
		REG_DISPTEST,  0x00	 // (0)Normal Operation Mode ; (1)Display Test Mode
	};

	SPI_Max7219_Init();

	// 给4个MAX7219发送第一个初始化命令
	SPI_NSS_LOW();
	// 
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[0]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[1]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[0]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[1]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[0]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[1]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[0]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[1]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	// 拉高SS,通知MAX7219将移位Register(16bit)的数据锁存起来。
	SPI_NSS_HIGH();

	//for(i=0;i<10000;i++);

	// 给4个MAX7219发送第二个初始化命令
	SPI_NSS_LOW();
	// 
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[2]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[3]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[2]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[3]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[2]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[3]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[2]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[3]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);	
	// 拉高SS,通知MAX7219将移位Register(16bit)的数据锁存起来。
	SPI_NSS_HIGH();

	for(i=0;i<100;i++);

	// 给4个MAX7219发送第三个初始化命令
	SPI_NSS_LOW();
	// 
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[4]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[5]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[4]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[5]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[4]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[5]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[4]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[5]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);	
	// 拉高SS,通知MAX7219将移位Register(16bit)的数据锁存起来。
	SPI_NSS_HIGH();

	for(i=0;i<100;i++);

	// 给4个MAX7219发送第四个初始化命令
	SPI_NSS_LOW();
	// 
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[6]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[7]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[6]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[7]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[6]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[7]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[6]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[7]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);	
	// 拉高SS,通知MAX7219将移位Register(16bit)的数据锁存起来。
	SPI_NSS_HIGH();

	for(i=0;i<100;i++);

	// 给4个MAX7219发送第五个初始化命令
	SPI_NSS_LOW();
	// 
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[8]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[9]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[8]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[9]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[8]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[9]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[8]);	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);			
	SPI_I2S_SendData(SPI1,ucs[9]);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);	
	// 拉高SS,通知MAX7219将移位Register(16bit)的数据锁存起来。
	SPI_NSS_HIGH();
}

/*******************************************************************************
* Function Name  : void IniMax7219s(void)
* Description    : Initializes board Max7219 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IniMax7219s(void)
{
	s32 i;
	SPI_Max7219_Init();

	for (i=0;i<999999;i++); 

	// Ini First Max7219
	MAX7219_SendDataToFirstMax7219(REG_DECODE, DECODE_MODE_NO_DECODE);		// Decode Mode
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFirstMax7219(REG_INTENSITY, INTENSITY_31_32);			// Intensity
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFirstMax7219(REG_LIMIT, SCAN_LIMIT_DIG01234567);      // Scan Limit
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFirstMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFirstMax7219(REG_DISPTEST, DISPLAY_TEST_NORMAL);        //Display Test

	MAX7219_Send4BitNum(0,0);
	MAX7219_Send4BitNum(1,1);


	MAX7219_SendDataToSecMax7219(REG_DECODE, DECODE_MODE_NO_DECODE);		// Decode Mode
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToSecMax7219(REG_INTENSITY, INTENSITY_31_32);			// Intensity
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToSecMax7219(REG_LIMIT, SCAN_LIMIT_DIG01234567);      // Scan Limit
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToSecMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToSecMax7219(REG_DISPTEST, DISPLAY_TEST_NORMAL);        //Display Test

	MAX7219_Send4BitNum(2,0);
	MAX7219_Send4BitNum(3,1);

	MAX7219_SendDataToThirdMax7219(REG_DECODE, DECODE_MODE_NO_DECODE);		// Decode Mode
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToThirdMax7219(REG_INTENSITY, INTENSITY_31_32);			// Intensity
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToThirdMax7219(REG_LIMIT, SCAN_LIMIT_DIG01234567);      // Scan Limit
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToThirdMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToThirdMax7219(REG_DISPTEST, DISPLAY_TEST_NORMAL);        //Display Test

	MAX7219_SendDataToThirdMax7219(REG_DIGIT0, 1);

	MAX7219_Send4BitNum(4,4);
	MAX7219_Send4BitNum(5,5);

	MAX7219_SendDataToFourMax7219(REG_DECODE, DECODE_MODE_NO_DECODE);		// Decode Mode
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFourMax7219(REG_INTENSITY, INTENSITY_31_32);			// Intensity
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFourMax7219(REG_LIMIT, SCAN_LIMIT_DIG01234567);      // Scan Limit
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFourMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
	//for (i=0;i<99999;i++);
	MAX7219_SendDataToFourMax7219(REG_DISPTEST, DISPLAY_TEST_NORMAL);        //Display Test

	MAX7219_Send4BitNum(6,6);
	MAX7219_Send4BitNum(7,7);
}

/*******************************************************************************
* Function Name  : SPI_Max7219_SendFourWord
* Description    : 发送 data TO 4个 max7219
* Input          : s32* pEightLedData 指针指向一个s32数据类型的一维数组(8个成员变量,每个成员变量的位数=4)
*                : 形如:s32 unitPrice1[8] = {1111,2222,3333,4444,5555,6666,7777,8888};
*                : 数入指针的和 board 中的LED实际对应关系
*                : EightLedData[0] <-> LED1 : EightLedData[1] <-> LED2 ... EightLedData[7] <-> LED8
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_Max7219_SendFourWord(s32* pEightLedData)
{
	/* variable define -------------------------------------------*/
	s32 i;          // 用于迭代二维数组中的第1维
	s32 j;			// 用于迭代二维数组中的第2维
	s32 m;			// 用于分解算法
	u8  leds[4][8]; // 用于SPI的发送暂存
	u8 digit[8];    // 用于暂存分解之后的位值
	s32 temp;	    // 用于分解算法

	/* Get u8 array for send ------------------------------------*/
	for (i=0,m=0;i<4;i++,m+=2)
	{
		/* 分解整数算法 -----------------------------------------*/
		temp = pEightLedData[m+1];			
		digit[4] = temp/1000;  // 得到千位
		temp %= 1000;
		digit[5] = temp/100;   // 得到百位
		temp %= 100;
		digit[6] = temp/10;    // 得到十位
		digit[7] = temp%10;    // 得到个位

		temp = pEightLedData[m];
		digit[0] = temp/1000;  // 得到千位
		temp %= 1000;
		digit[1] = temp/100;   // 得到百位
		temp %= 100;
		digit[2] =temp/10;     // 得到十位
		digit[3] = temp%10;    // 得到个位

		/* 存到SPI发送用到的二维数组中 --------------------------*/
		for (j=0;j<8;j++)
		{
			leds[i][j] = digit[j];
		}
	}

	/* data Send ------------------------------------------------*/
	for(i=7;i>=0;i--)
	{	
		SPI_NSS_LOW();
		for(j=3;j>=0;j--)
		{
			while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
			SPI_I2S_SendData(SPI1,i+1 );	

			while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
			SPI_I2S_SendData(SPI1, leds[j][i]);				
		} 

		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
		SPI_NSS_HIGH();
	}
}

/*******************************************************************************
* Function Name  : void MAX7219_SendDataToFirstMax7219(u8 Reg, u8 data)
* Description    : 发送由 寄存器地址和BYTE数据组合成的u16数据FRAME到第一个MAX7219
*
* Input          : Reg-对应MAX7219的寄存器的地址;data-对应发送的数据
*                 
* Output         : None
* Return         : None
*******************************************************************************/
void MAX7219_SendDataToFirstMax7219(u8 Reg, u8 data)
{
	//u32 i;
	u16 temp1;
	u16 temp2;
	temp1 = (u16)Reg;
	temp2 = (u16)data;

	temp1<<=8;
	temp1 &= 0xFF00;

	temp2 &= 0x00FF;

	temp1 |= temp2;

	SPI_NSS_LOW();

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, temp1);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_NSS_HIGH();
}

/*******************************************************************************
* Function Name  : void MAX7219_SendDataToSecMax7219(u8 Reg, u8 data)
*
* Description    : 发送由 寄存器地址和BYTE数据组合成的u16数据FRAME到第一个MAX7219
*
* Input          : Reg-对应MAX7219的寄存器的地址;data-对应发送的数据
*                 
* Output         : None
* Return         : None
*******************************************************************************/
void MAX7219_SendDataToSecMax7219(u8 Reg, u8 data)
{
	//u32 i;
	u16 temp1;
	u16 temp2;
	temp1 = (u16)Reg;
	temp2 = (u16)data;

	temp1<<=8;
	temp1 &= 0xFF00;

	temp2 &= 0x00FF;

	temp1 |= temp2;

	SPI_NSS_LOW();

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, temp1);
	//for (i=0;i<999;i++);
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_NSS_HIGH();
}

/*******************************************************************************
* Function Name  : void MAX7219_SendDataToThirdMax7219(u8 Reg, u8 data)
*
* Description    : 发送由 寄存器地址和BYTE数据组合成的u16数据FRAME到第一个MAX7219
*
* Input          : Reg-对应MAX7219的寄存器的地址;data-对应发送的数据
*                 
* Output         : None
* Return         : None
*******************************************************************************/
void MAX7219_SendDataToThirdMax7219(u8 Reg, u8 data)
{
	u16 temp1;
	u16 temp2;
	temp1 = (u16)Reg;
	temp2 = (u16)data;

	temp1<<=8;
	temp1 &= 0xFF00;

	temp2 &= 0x00FF;

	temp1 |= temp2;


	SPI_NSS_LOW();

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, temp1);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_NSS_HIGH();
}

/*******************************************************************************
* Function Name  : void MAX7219_SendDataToFourMax7219(u8 Reg, u8 data)
*
* Description    : 发送由 寄存器地址和BYTE数据组合成的u16数据FRAME到第一个MAX7219
*
* Input          : Reg-对应MAX7219的寄存器的地址;data-对应发送的数据
*                 
* Output         : None
* Return         : None
*******************************************************************************/
void MAX7219_SendDataToFourMax7219(u8 Reg, u8 data)
{
	u16 temp1;
	u16 temp2;
	temp1 = (u16)Reg;
	temp2 = (u16)data;

	temp1<<=8;
	temp1 &= 0xFF00;

	temp2 &= 0x00FF;

	temp1 |= temp2;

	SPI_NSS_LOW();

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, temp1);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_I2S_SendData(SPI1, NULL_OP);

	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
	SPI_NSS_HIGH();
}

/*
*********************************************************************************************************
*					            	u8 MAX7219_LedBitCoding(u8 data)
*
* Description  : 把输入的数据编码为MAX7219要求的LED 标准码
*
* Argument     : (IN) u8 data // 0、1、2、3、4、5、6、7、8、9在LED中显示0-9
*							  // A-A ; B-小数点 ; D-Dark
* 
*			
* Returns	   : SM_TRUE - 定时时间到		SM_FALSE - 定时时间未到
*********************************************************************************************************
* Version 1.0
* Author: qzm
*/
u8 MAX7219_LedBitCoding(u8 data)
{
	u8 ret;

	switch ((u16)data)
	{
	case 0x00:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_C|LED_SEG_D|LED_SEG_E|LED_SEG_F;
		break;
	case 0x01:
		ret = LED_SEG_B|LED_SEG_C;
		break;
	case 0x02:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_G|LED_SEG_E|LED_SEG_D;
		break;
	case 0x03:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_G|LED_SEG_C|LED_SEG_D;
		break;
	case 0x04:
		ret = LED_SEG_F|LED_SEG_G|LED_SEG_B|LED_SEG_C;
		break;
	case 0x05:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_G|LED_SEG_C|LED_SEG_D;
		break;
	case 0x06:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_E|LED_SEG_C|LED_SEG_D|LED_SEG_G;
		break;
	case 0x07:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_C;
		break;
	case 0x08:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_C|LED_SEG_D|LED_SEG_E|LED_SEG_F|LED_SEG_G;
		break;
	case 0x09:
		ret = LED_SEG_A|LED_SEG_B|LED_SEG_C|LED_SEG_D|LED_SEG_F|LED_SEG_G;
		break;
	case 0x0A:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_E|LED_SEG_B|LED_SEG_C|LED_SEG_G;
		break;
	case 0x0B: // 小数点
		ret = LED_SEG_DP;
		break;
	case 0x0C:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_E|LED_SEG_D;
		break;
	case 0x0D: // Dark
		ret = 0;
		break;
	case 0x0E:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_E|LED_SEG_D|LED_SEG_G;
		break;
	case 0x0F:
		ret = LED_SEG_A|LED_SEG_F|LED_SEG_E|LED_SEG_G;
		break;
	case 0x10: // Low line    _
		ret = LED_SEG_D;
		break;
	case 0x11: // Middle line -
		ret = LED_SEG_G;
		break;
	case 0x12: // Height line ~
		ret = LED_SEG_A;
		break;
	default:
		ret = 0x00;
		break;
	}

	return ret;
}

/*
*********************************************************************************************************
*							void MAX7219_SPI_Send4BitNum(u8 LedIndex, u16 data)
*
* Descript : 使 指定的4Bit LED 显示 十进制 0000 - 9999的数值 或 其他编码显示
* 
* Param(s) :
* (in)	 	 u8 LedIndex   - 从近RS485-1开始数 0、1、2、3、...7
* (in)       u16 data      - 待显示的十进制整数或其他显示编码
* (out)    : none
* (return) : none
*********************************************************************************************************
* NOTE:输入的 data 只能显示 0000-9999的数字范围,当data >= 0xF000时,表示要显示其他编码 
* data = 0xF000 显示: DARK
*/
void MAX7219_Send4BitNum(u8 LedIndex, u16 data)
{
	/* variable define ----------------------------------------------------*/
	u8 digit[4];  // 用于暂存分解之后的位值
	u16 temp;     // 用于分解算法
//	u8 leds;      // 用于SPI的发送暂存


	if ( data<=9999 ) // 显示十进制数字
	{
		/* --------------------------------------------------------------------*/
		temp = data;

		digit[0] = temp/1000;    // 得到千位
		temp    %= 1000;

		digit[1] = temp/100;     // 得到百位
		temp    %= 100;

		digit[2] = temp/10;		 // 得到十位
		digit[3] = temp%10;      // 得到个位

		switch (LedIndex)
		{
		case 0: // LED0
			MAX7219_SendDataToFirstMax7219(REG_DIGIT0, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT1, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT2, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT3, MAX7219_LedBitCoding(digit[3]));
			break;
		case 1: // LED1
			MAX7219_SendDataToFirstMax7219(REG_DIGIT4, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT5, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT6, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToFirstMax7219(REG_DIGIT7, MAX7219_LedBitCoding(digit[3]));
			break;

		case 2: // LED2
			MAX7219_SendDataToSecMax7219(REG_DIGIT0, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT1, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT2, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT3, MAX7219_LedBitCoding(digit[3]));
			break;
		case 3: // LED3
			MAX7219_SendDataToSecMax7219(REG_DIGIT4, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT5, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT6, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToSecMax7219(REG_DIGIT7, MAX7219_LedBitCoding(digit[3]));
			break;

		case 4: // LED4
			MAX7219_SendDataToThirdMax7219(REG_DIGIT0, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT1, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT2, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT3, MAX7219_LedBitCoding(digit[3]));
			break;
		case 5: // LED5
			MAX7219_SendDataToThirdMax7219(REG_DIGIT4, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT5, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT6, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToThirdMax7219(REG_DIGIT7, MAX7219_LedBitCoding(digit[3]));
			break;

		case 6: // LED6
			MAX7219_SendDataToFourMax7219(REG_DIGIT0, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT1, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT2, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT3, MAX7219_LedBitCoding(digit[3]));
			break;
		case 7: // LED7
			MAX7219_SendDataToFourMax7219(REG_DIGIT4, MAX7219_LedBitCoding(digit[0]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT5, MAX7219_LedBitCoding(digit[1]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT6, MAX7219_LedBitCoding(digit[2]));
			MAX7219_SendDataToFourMax7219(REG_DIGIT7, MAX7219_LedBitCoding(digit[3]));
			break;

		default:
			break;
		}/* switch (LedIndex) */
	}/* if ( (data>=0)||(data<=9999) ) // 显示十进制数字 */
	else if (data==0xF000) // 显示 DARK
	{
		MAX7219_Send4BitDark(LedIndex);
	}

}

/*
*********************************************************************************************************
*							void MAX7219_Send4BitDark(u8 LedIndex)
*
* Descript : 使 指定的4Bit LED 全世界DARK
* 
* Param(s) :
* (in)	 	 u8 LedIndex   - 从近RS485-1开始数 0、1、2、3、...7
* (out)    : none
* (return) : none
*********************************************************************************************************
*/
void MAX7219_Send4BitDark(u8 LedIndex)
{
#define LED_DARK	0x0D
	switch (LedIndex)
	{
	case 0: // LED0
		MAX7219_SendDataToFirstMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_DARK));
		break;
	case 1: // LED1
		MAX7219_SendDataToFirstMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_DARK));
		break;

	case 2: // LED2
		MAX7219_SendDataToSecMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_DARK));
		break;
	case 3: // LED3
		MAX7219_SendDataToSecMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToSecMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_DARK));
		break;

	case 4: // LED4
		MAX7219_SendDataToThirdMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_DARK));
		break;
	case 5: // LED5
		MAX7219_SendDataToThirdMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_DARK));
		break;

	case 6: // LED6
		MAX7219_SendDataToFourMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_DARK));
		break;
	case 7: // LED7
		MAX7219_SendDataToFourMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_DARK));
		MAX7219_SendDataToFourMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_DARK));
		break;

	default:
		break;
	}
}

/*
*********************************************************************************************************
*							void MAX7219_Send4BitLow(u8 LedIndex)
*
* Descript : 使 指定的4Bit LED显示低 LINE
* 
* Param(s) :
* (in)	 	 u8 LedIndex   - 从近RS485-1开始数 0、1、2、3、...7
* (out)    : none
* (return) : none
*********************************************************************************************************
*/
void MAX7219_Send4BitLow(u8 LedIndex)
{
#define LED_LOW_LINE	0x10
	switch (LedIndex)
	{
	case 0: // LED0
		MAX7219_SendDataToFirstMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;
	case 1: // LED1
		MAX7219_SendDataToFirstMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;

	case 2: // LED2
		MAX7219_SendDataToSecMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;
	case 3: // LED3
		MAX7219_SendDataToSecMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;

	case 4: // LED4
		MAX7219_SendDataToThirdMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;
	case 5: // LED5
		MAX7219_SendDataToThirdMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;

	case 6: // LED6
		MAX7219_SendDataToFourMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;
	case 7: // LED7
		MAX7219_SendDataToFourMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_LOW_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_LOW_LINE));
		break;

	default:
		break;
	}
}

/*
*********************************************************************************************************
*							void MAX7219_Send4BitMiddle(u8 LedIndex)
*
* Descript : 使 指定的4Bit LED显示中 LINE
* 
* Param(s) :
* (in)	 	 u8 LedIndex   - 从近RS485-1开始数 0、1、2、3、...7
* (out)    : none
* (return) : none
*********************************************************************************************************
*/
void MAX7219_Send4BitMiddle(u8 LedIndex)
{
#define LED_MIDDLE_LINE	0x11
	switch (LedIndex)
	{
	case 0: // LED0
		MAX7219_SendDataToFirstMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;
	case 1: // LED1
		MAX7219_SendDataToFirstMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;

	case 2: // LED2
		MAX7219_SendDataToSecMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;
	case 3: // LED3
		MAX7219_SendDataToSecMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;

	case 4: // LED4
		MAX7219_SendDataToThirdMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;
	case 5: // LED5
		MAX7219_SendDataToThirdMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;

	case 6: // LED6
		MAX7219_SendDataToFourMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;
	case 7: // LED7
		MAX7219_SendDataToFourMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_MIDDLE_LINE));
		break;

	default:
		break;
	}
}

/*
*********************************************************************************************************
*							void MAX7219_Send4BitHeight(u8 LedIndex)
*
* Descript : 使 指定的4Bit LED显示高 LINE
* 
* Param(s) :
* (in)	 	  u8 LedIndex   - 从近RS485-1开始数 0、1、2、3、...7
* (out)    : none
* (return) : none
*********************************************************************************************************
*/
void MAX7219_Send4BitHeight(u8 LedIndex)
{
#define LED_HEIGHT_LINE	0x12
	switch (LedIndex)
	{
	case 0: // LED0
		MAX7219_SendDataToFirstMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;
	case 1: // LED1
		MAX7219_SendDataToFirstMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFirstMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;

	case 2: // LED2
		MAX7219_SendDataToSecMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;
	case 3: // LED3
		MAX7219_SendDataToSecMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToSecMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;

	case 4: // LED4
		MAX7219_SendDataToThirdMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;
	case 5: // LED5
		MAX7219_SendDataToThirdMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToThirdMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;

	case 6: // LED6
		MAX7219_SendDataToFourMax7219(REG_DIGIT0, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT1, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT2, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT3, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;
	case 7: // LED7
		MAX7219_SendDataToFourMax7219(REG_DIGIT4, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT5, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT6, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		MAX7219_SendDataToFourMax7219(REG_DIGIT7, MAX7219_LedBitCoding(LED_HEIGHT_LINE));
		break;

	default:
		break;
	}
}

/*
*********************************************************************************************************
*                     void MAX7219_IntensityAdjust(u8 MAX7219Index, u8 IntensityValue)
*
* Descript : 调节指定 MAX7219 的亮度
* 
* Param(s) :
* (in)	 	 u8 MAX7219Index   - 从近RS485-1开始数 0、1、2、3
* (in)       u8 IntensityValue - 亮度代码;从0x00-0x0F,共16种亮度选择 
* (out)    : none
* (return) : none
*********************************************************************************************************
*/
void MAX7219_IntensityAdjust(u8 MAX7219Index, u8 IntensityValue/* 0x00-0x0F */)
{
	switch (MAX7219Index)
	{
	case 0: // MAX7219_0
		MAX7219_SendDataToFirstMax7219(REG_INTENSITY, IntensityValue);
		break;
	case 1: // MAX7219_1
		MAX7219_SendDataToSecMax7219(REG_INTENSITY, IntensityValue);
		break;

	case 2: // MAX7219_2
		MAX7219_SendDataToThirdMax7219(REG_INTENSITY, IntensityValue);
		break;
	case 3: // MAX7219_3
		MAX7219_SendDataToFourMax7219(REG_INTENSITY, IntensityValue);
		break;

	default:
		break;
	}
}

void MAX7219_CloseAllLedDisplay(void)
{
    MAX7219_SendDataToFirstMax7219(REG_SHUTDOWN, SHUTDOWN_SHUTDOWN);          // Shutdown
    MAX7219_SendDataToSecMax7219(REG_SHUTDOWN,   SHUTDOWN_SHUTDOWN);          // Shutdown
    MAX7219_SendDataToThirdMax7219(REG_SHUTDOWN, SHUTDOWN_SHUTDOWN);          // Shutdown
    MAX7219_SendDataToFourMax7219(REG_SHUTDOWN,  SHUTDOWN_SHUTDOWN);          // Shutdown
}

void MAX7219_OpenAllLedDisplay(void)
{
    MAX7219_SendDataToFirstMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
    MAX7219_SendDataToSecMax7219(REG_SHUTDOWN,   SHUTDOWN_NORMAL);          // Shutdown
    MAX7219_SendDataToThirdMax7219(REG_SHUTDOWN, SHUTDOWN_NORMAL);          // Shutdown
    MAX7219_SendDataToFourMax7219(REG_SHUTDOWN,  SHUTDOWN_NORMAL);          // Shutdown
}

/*******************************************************************************
* Function Name  : SPI_FLASH_ReadID
* Description    : Reads FLASH identification.
* Input          : None
* Output         : None
* Return         : FLASH identification
*******************************************************************************/
//u32 SPI_FLASH_ReadID(void)
//{
//	u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;

/* Select the FLASH: Chip Select low */
//	SPI_FLASH_CS_LOW();

/* Send "RDID " instruction */
///	SPI_FLASH_SendByte(0x9F);

/* Read a byte from the FLASH */
//Temp0 = SPI_FLASH_SendByte(Dummy_Byte);

/* Read a byte from the FLASH */
//	Temp1 = SPI_FLASH_SendByte(Dummy_Byte);

/* Read a byte from the FLASH */
//	Temp2 = SPI_FLASH_SendByte(Dummy_Byte);

/* Deselect the FLASH: Chip Select high */
//	SPI_FLASH_CS_HIGH();

//	Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2;

//	return Temp;
//}

/*******************************************************************************
* Function Name  : SPI_FLASH_StartReadSequence
* Description    : Initiates a read data byte (READ) sequence from the Flash.
*                  This is done by driving the /CS line low to select the device,
*                  then the READ instruction is transmitted followed by 3 bytes
*                  address. This function exit and keep the /CS line low, so the
*                  Flash still being selected. With this technique the whole
*                  content of the Flash is read with a single READ instruction.
* Input          : - ReadAddr : FLASH's internal address to read from.
* Output         : None
* Return         : None
*******************************************************************************/
// void SPI_FLASH_StartReadSequence(u32 ReadAddr)
// {
// 	/* Select the FLASH: Chip Select low */
// 	//SPI_FLASH_CS_LOW();
// 
// 	/* Send "Read from Memory " instruction */
// 	//SPI_FLASH_SendByte(READ);
// 
// 	/* Send the 24-bit address of the address to read from -----------------------*/  
// 	/* Send ReadAddr high nibble address byte */
// 	SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
// 	/* Send ReadAddr medium nibble address byte */
// 	SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
// 	/* Send ReadAddr low nibble address byte */
// 	SPI_FLASH_SendByte(ReadAddr & 0xFF);
// }

/*******************************************************************************
* Function Name  : SPI_FLASH_ReadByte
* Description    : Reads a byte from the SPI Flash.
*                  This function must be used only if the Start_Read_Sequence
*                  function has been previously called.
* Input          : None
* Output         : None
* Return         : Byte Read from the SPI Flash.
*******************************************************************************/
//u8 SPI_FLASH_ReadByte(void)
//{
//	return (SPI_FLASH_SendByte(Dummy_Byte));
//}

/*******************************************************************************
* Function Name  : SPI_FLASH_SendByte
* Description    : Sends a byte through the SPI interface and return the byte 
*                  received from the SPI bus.
* Input          : byte : byte to send.
* Output         : None
* Return         : The value of the received byte.
*******************************************************************************/
//u8 SPI_FLASH_SendByte(u8 byte)
//{
//	/* Loop while DR register in not emplty */
//	while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);

/* Send byte through the SPI1 peripheral */
//	SPI_SendData(SPI1, byte);

/* Wait to receive a byte */
//	while(SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
//	return SPI_ReceiveData(SPI1);
//} 

/*******************************************************************************
* Function Name  : SPI_FLASH_SendHalfWord
* Description    : Sends a Half Word through the SPI interface and return the  
*                  Half Word received from the SPI bus.
* Input          : Half Word : Half Word to send.
* Output         : None
* Return         : The value of the received Half Word.
*******************************************************************************/
//u16 SPI_FLASH_SendHalfWord(u16 HalfWord)
//{
/* Loop while DR register in not emplty */
//	while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);

/* Send Half Word through the SPI1 peripheral */
//	SPI_SendData(SPI1, HalfWord);

/* Wait to receive a Half Word */
//	while(SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);

/* Return the Half Word read from the SPI bus */
//	return SPI_ReceiveData(SPI1);
//}

/*******************************************************************************
* Function Name  : SPI_FLASH_WriteEnable
* Description    : Enables the write access to the FLASH.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
//void SPI_FLASH_WriteEnable(void)
//{
/* Select the FLASH: Chip Select low */
//	SPI_FLASH_CS_LOW();

/* Send "Write Enable" instruction */
//	SPI_FLASH_SendByte(WREN);

/* Deselect the FLASH: Chip Select high */
//	SPI_FLASH_CS_HIGH();
//}

/*******************************************************************************
* Function Name  : SPI_FLASH_WaitForWriteEnd
* Description    : Polls the status of the Write In Progress (WIP) flag in the  
*                  FLASH's status  register  and  loop  until write  opertaion
*                  has completed.  
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
//void SPI_FLASH_WaitForWriteEnd(void)
//{
//	u8 FLASH_Status = 0;

/* Select the FLASH: Chip Select low */
//	SPI_FLASH_CS_LOW();

/* Send "Read Status Register" instruction */
//	SPI_FLASH_SendByte(RDSR);

/* Loop as long as the memory is busy with a write cycle */
//	do
//	{
/* Send a dummy byte to generate the clock needed by the FLASH 
and put the value of the status register in FLASH_Status variable */
//		FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);

//	} while((FLASH_Status & WIP_Flag) == SET); /* Write in progress */

/* Deselect the FLASH: Chip Select high */
//	SPI_FLASH_CS_HIGH();                                                        
//}          

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

原创文章 46 获赞 8 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u012915636/article/details/104568467
今日推荐