📄 main.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 + -