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

📄 main.c

📁 s3c44b0x对FLASH的读写,测试成功K9F2G08
💻 C
字号:
/*完成串口的发送和接收中断的功能*/

#include "option.h"
#include "44B.H"
#include "stdio.h"
#include "types.h"


#define LED1            13                                 //C口的P13脚控制LED1
#define LED2            15                                 //C口的P15脚控制LED2
#define K9FXXX_CS       6                                  //C口的P6脚连K9FXXX的CS脚
#define K9FXXX_BUSY     7                                  //C口的P7脚连K9FXXX的BUSY脚

#define LED_BLACK1		rPDATC |= 1<<LED1                  //设置LED1点亮的数据
#define LED_BLACK2		rPDATC |= 1<<LED2                  //设置LED2点亮的数据

#define LED_LIGHT1		rPDATC &= ~(1<<LED1)               //设置LED1点灭的数据
#define LED_LIGHT2		rPDATC &= ~(1<<LED2)               //设置LED2点灭的数据

#define K9F_CS_OUT	 	rPCONC |= ( 1<<(K9FXXX_CS<<1) )          //确定控制片选K9FXXX的引脚     
#define K9F_BUSY_IN	 	rPCONC &= ~( 3<<(K9FXXX_BUSY <<1) )       //确定忙信号K9FXXX的引脚
#define K9F_BUSY_PLUM   rPDATC &= ~( 1<<K9FXXX_BUSY  );		    // busy上拉
  
#define K9F_CS_ENABLE	rPDATC &= ~( 1<<K9FXXX_CS )             //片选信号使能
#define K9F_CS_DISABLE	rPDATC |= ( 1<<K9FXXX_CS )              //片选信号禁止
#define K9F_RB_PIN		(rPDATC&( 1<<K9FXXX_BUSY  ) )	        //读busy信号
 
#define RAM_FLASH_ADDR		0x02000000		                            // flash的地址

#define K9F_COMMAND_CHIP_ID 0x90                             // 读厂家/芯片ID

// 定义地址
#define K9F_ADDR_DATA		RAM_FLASH_ADDR		                       // 数据端口
#define K9F_ADDR_COMMAND 	(RAM_FLASH_ADDR+2)	                       // 命令端口 
#define K9F_ADDR_ADDR		(RAM_FLASH_ADDR+4)	                       // 地址端口

#define K9fReadByte() 	 	 *(volatile UCHAR *)K9F_ADDR_DATA
#define K9fWriteByte(c) 	 *(volatile UCHAR *)K9F_ADDR_DATA = (c)
#define K9fCommandLatch(cmd) 	 *(volatile UCHAR *)K9F_ADDR_COMMAND = (cmd)
#define K9fAddressLatch(addr) 	 *(volatile UCHAR *)K9F_ADDR_ADDR = (addr)

UCHAR  DATA; 
UINT32 K9FID; 

CHAR DebugBuf[256];                                             


static void __irq Uart0SendInt(void);                      //定义UART0发送中断处理函数
static void __irq Uart0ReciveInt(void);                    //定义UART0接收中断处理函数


void LedInit()                                             //LED初始化
 {
	
	rPCONC = 0x044000000;                                  //设置PC15,PC13为输出
	
	LED_BLACK1;                                            //先灭LED1
	LED_BLACK2;                                            //先灭LED2

}

// 初始化K9FXXX
void K9f5608Init()
{   
 
	K9F_CS_OUT;
	K9F_BUSY_IN;
	K9F_BUSY_PLUM;
  
}

UINT32 K9fReadChipID()
{  
    UINT32 id;
    
    K9F_CS_ENABLE;                         		// 片选 
      
    K9fCommandLatch( K9F_COMMAND_CHIP_ID ); 	// 写入命令 90h     
    K9fAddressLatch( 0x00 );                	// 写入地址 0h         
    
   id = K9fReadByte()<<8;                      // 读厂家ID     
   id |= K9fReadByte();                   		// 读芯片ID    
              
    K9F_CS_DISABLE;                        	    // 片选    
    return id;     
} 


void delay(int time)                                       //延时函数                                     
{
  int i;
  for(;time>0;time--)
    for(i=100;i>0;i--);
}


void UART0Init( int baud)                                  //UART0初始化
{
	
	rPCONE  = 0x28;	                                       //配置为UART口模式
	rUFCON0 = 0x0;                                         //UART0 FIFO控制寄存器 FIFO disable  
    rUMCON0 = 0x0;                                         //UART0 MODEN控制寄存器
    rULCON0 = 0x3;                                         //UART0线控制寄存器 Normal,No parity,1 stop,8 bit  
    rUCON0  = 0x345;                                       //UART0控制寄存器器 01 = Interrupt request or polling mode
    rUBRDIV0 = ( (int)(MCLK/16/baud) -1 );                 //UART0波特率分频寄存器 
   
    
    pISR_UTXD0 = (int)Uart0SendInt;                        //UART0发送中断跳转地址
    pISR_URXD0 = (int)Uart0ReciveInt;                      //UART0接收中断跳转地址
    
    rINTCON = 0x01;                                        //中断控制寄存器 允许IRQ中断
    
    rINTMOD = 0x00000000;                                  //中断模式寄存器 都为IQR中断模式
    
   rINTMSK = ~(BIT_UTXD0|BIT_URXD0);                       //中断屏蔽寄存器 允许UART0发送接收中断     
}


void __irq Uart0SendInt()                                 //UART0发送中断程序
{
	while(!(rUTRSTAT0 & 0x2));	                          //UART0 TX/RX状态寄存器 查询发送缓冲寄存器没有包含有效的数据
	LED_LIGHT1;
	delay (100);
	LED_BLACK1;
	rI_ISPC = BIT_UTXD0;
}


void __irq Uart0ReciveInt()                              //UART0接收中断程序
{
 DATA=rURXH0;                                            //接收的数据存储
 rUTXH0 = DATA;                                          //将接收的数据赋给发送缓冲寄存器
 LED_LIGHT2;                                             //点亮LED2
 delay (100);                                            //延时
 LED_BLACK2;                                             //灭LED2
 rI_ISPC = BIT_URXD0;                                    //中断服务清除
}


// 串口0发送一个字符串
void UART0SendString( CHAR *str )
{
	while( *str )
	{
  		while(!(rUTRSTAT0 & 0x2));		
		rUTXH0 = *str;
		str++;
  	}
} 

void Main(void)                                          //主函数

{	
    delay(3000);	                                     //延时让系统稳定
	DISABLE_INTERRUPT;                                   //关闭所有的中断
	LedInit();                                           //LED初始化
	
	
   UART0Init( 115200);                                    //串口初始化 波特率是115200
 
   K9f5608Init(); 

   K9FID = K9fReadChipID();
   
 
	//ENABLE_INTERRUPT;                                   //开所有中断
	
	while(1)                                            //主循环
	{
		LED_BLACK1;                                     //LED1灭
		delay(300);                                     //延时
		LED_BLACK2;	                                    //LED2灭
		
        sprintf( DebugBuf,"K9fxx08 Chip ID = %04x.  ", K9FID   );
	    UART0SendString( DebugBuf );
	}
}

⌨️ 快捷键说明

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