📄 port.c
字号:
#include "port.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//*extern nand_control_t my_nand_control;
//*extern control_t my_control; //图片浏览使用
//全局数组
fifobuf_t send_fifobuf_t;
fifobuf_t recv_fifobuf_t;
fifobuf_t recv_file_fifobuf_t;
unsigned char send_fifobuf_data[fifo_send_size];
unsigned char recv_fifobuf_data[fifo_recv_size];
unsigned char recv_file_fifobuf_data[fifo_recv_file_size];
/**
int isfile;
int timer_id_getfile;
int timer_id_check_getfile;
char file_name[50];
*/
void read_work(void)
{
//*done_show_pit();
while((UFSTAT0 &0x7f))
{
//*if(isfile != 1)//串口命令
//{
fifobuf_datain(&recv_fifobuf_t,URXH0);
//}
//else//串口接受文件(BMP)
//{
// fifobuf_datain(&recv_file_fifobuf_t,URXH0);
//}
}
/**
if(isfile != 1)
{
event_start(event_port0_recv);
}
else
{
//event_start(event_port0_recv_file);
}
*/
//LCD_DrawText(0,0,(char *)(recv_fifobuf_t.pdata),40,RGB(255,255,255),RGB(0,0,0));
//UART_SendBuff(0,recv_fifobuf_t.pdata,recv_fifobuf_t.now_size);
}
void send_work(void)
{
unsigned char tempdata;
while(!(UFSTAT0 & (1 << 14)))
{
tempdata = fifobuf_dataout(&send_fifobuf_t);
if(tempdata == 0)//数据取光了
{
IRQ_UnInstall(INT_TYPE_INT_TXD0);
//UTXH0 = tempdata;
return;
}
UTXH0 = tempdata;
}
}
int UART_Init(int nPort, int nBaudRate, int nDatabits, int nStopbits, int nParity)
{
int temp_bit = 0;
if(nPort < 0 || nPort > 2 || nStopbits < 0 || nStopbits > 2|| nDatabits < 5 || nDatabits > 8)
{
return -1;
}
GPHCON = 0xAAA0;//设置针脚
GPHUP = 0xf0;
if(nPort == 0)//对0号串口进行初始
{
//UCON0 = 0x3c5;//有开启异常中断
UCON0 = (0<<12)|(2<<10)|(1<<9)|(1<<8)|(1<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);//无开启异常中断
temp_bit = (int)(PCLK/(nBaudRate*16))-1;
UBRDIV0 = temp_bit;//设置波特率
if(nStopbits == 1 && nDatabits == 5)
{
ULCON0 = 0x0;//设置帧格式(字长5位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 6)
{
ULCON0 = 0x1;//设置帧格式(字长6位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 7)
{
ULCON0 = 0x2;//设置帧格式(字长7位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 8)
{
ULCON0 = 0x3;//设置帧格式(字长8位 停止1位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 8 )
{
ULCON0 = 0x7;//设置帧格式(字长8位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 7)
{
ULCON0 = 0x6;//设置帧格式(字长7位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 6)
{
ULCON0 = 0x5;//设置帧格式(字长6位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 5)
{
ULCON0 = 0x4;//设置帧格式(字长5位 停止2位 无奇偶)
}
UMCON0 = 0;//不设置流控
UFCON0 = (2<<6)|(3<<4)|(0<<3)|(0<<2)|(0<<1)|(1<<0);//设置FIFO 触发深度都为 32K
fifobuf_init(&send_fifobuf_t,send_fifobuf_data,fifo_send_size); //创建发送缓冲区
fifobuf_init(&recv_fifobuf_t,recv_fifobuf_data,fifo_recv_size); //创建接收缓冲区
fifobuf_init(&recv_file_fifobuf_t,recv_file_fifobuf_data,fifo_recv_file_size); //创建接收缓冲区
select_data_buf_init(); //待解析数组初始化
}
else if(nPort == 1)
{
//UCON1 = 0x3c5;//有开启异常中断
UCON1 = (0<<12)|(2<<10)|(0<<9)|(0<<8)|(1<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);//无开启异常中断
temp_bit = (int)(PCLK/(nBaudRate*16))-1;
UBRDIV1 = temp_bit;//设置波特率
if(nStopbits == 1 && nDatabits == 5)
{
ULCON1 = 0x0;//设置帧格式(字长5位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 6)
{
ULCON1 = 0x1;//设置帧格式(字长6位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 7)
{
ULCON1 = 0x2;//设置帧格式(字长7位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 8)
{
ULCON1 = 0x3;//设置帧格式(字长8位 停止1位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 8 )
{
ULCON1 = 0x7;//设置帧格式(字长8位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 7)
{
ULCON1 = 0x6;//设置帧格式(字长7位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 6)
{
ULCON1 = 0x5;//设置帧格式(字长6位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 5)
{
ULCON1 = 0x4;//设置帧格式(字长5位 停止2位 无奇偶)
}
UMCON1 = 0;//不设置流控
UFCON1 = (2<<6)|(3<<4)|(0<<3)|(0<<2)|(0<<1)|(1<<0);//设置FIFO 触发深度都为 32K
}
else if(nPort == 2)
{
//UCON2 = 0x3c5;//有开启异常中断
UCON2 = (0<<12)|(2<<10)|(0<<9)|(0<<8)|(1<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);//无开启异常中断
temp_bit = (int)(PCLK/(nBaudRate*16))-1;
UBRDIV2 = temp_bit;//设置波特率
if(nStopbits == 1 && nDatabits == 5)
{
ULCON2 = 0x0;//设置帧格式(字长5位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 6)
{
ULCON2 = 0x1;//设置帧格式(字长6位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 7)
{
ULCON2 = 0x2;//设置帧格式(字长7位 停止1位 无奇偶)
}
else if(nStopbits == 1 && nDatabits == 8)
{
ULCON2 = 0x3;//设置帧格式(字长8位 停止1位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 8 )
{
ULCON2 = 0x7;//设置帧格式(字长8位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 7)
{
ULCON2 = 0x6;//设置帧格式(字长7位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 6)
{
ULCON2 = 0x5;//设置帧格式(字长6位 停止2位 无奇偶)
}
else if(nStopbits == 2 && nDatabits == 5)
{
ULCON2 = 0x4;//设置帧格式(字长5位 停止2位 无奇偶)
}
UMCON2 = 0;//不设置流控
UFCON2 = (2<<6)|(3<<4)|(0<<3)|(0<<2)|(0<<1)|(1<<0);//设置FIFO 触发深度都为 32K
}
return 1;
}
int UART_Open(int nPort)//装载回调 开中断
{
if(nPort < 0 || nPort > 2)
{
return -1;
}
if(nPort == 0)
{
IRQ_SetMask(28,0);//开启串口0一级中断
IRQ_Install(INT_TYPE_INT_RXD0,read_work);//注册串口0数据接收
//*event_add(event_port0_recv,select_portdata);//注册事件
//*event_add(event_switch_data,switch_data);//注册事件
//*event_add(event_port0_recv_file,get_file);//注册事件
//*timer_id_check_getfile = TIMER_TS_Create(5000,0,timer_check_isget_file);
//*timer_id_getfile = TIMER_TS_Create(22000,0,timer_get_pit);
}
else if(nPort == 1)
{
}
else if(nPort == 2)
{
}
return 1;
}
int UART_Close(int nPort)//回调卸载 关中断
{
if(nPort < 0 || nPort > 2)
{
return -1;
}
if(nPort == 0)
{
IRQ_SetMask(28,1);
IRQ_UnInstall(INT_TYPE_INT_RXD0);
}
else if(nPort == 1)
{
}
else if(nPort == 2)
{
}
return 1;
}
int UART_SendBuff(int nPort, unsigned char *pcBuff, int nLength)
{
int i,index;
index=0;
if(nPort < 0 || nPort > 2 || pcBuff == NULL)
{
return -1;
}
if(nPort == 0 )
{
index=0;
for(i = 0;i < nLength ; i++)
{
if(fifobuf_datain(&send_fifobuf_t,*(pcBuff+index))==0)
{
IRQ_Install(INT_TYPE_INT_TXD0,send_work);
return -1;
}
index++;
}
IRQ_Install(INT_TYPE_INT_TXD0,send_work);
}
else if(nPort == 1 )
{
}
else if(nPort == 2 )
{
}
return 1;
}
int UART_RecvBuff(int nPort, unsigned char *pcBuff, int nSize)
{
int i,index;
unsigned char tempdata;
index=0;
if(nPort < 0 || nPort > 2 || pcBuff == NULL|| nSize == 0)
{
return -1;
}
if(nPort == 0)
{
for(i = 0 ; i< nSize; i++)
{
tempdata = fifobuf_dataout(&recv_fifobuf_t);
if(tempdata == 0)
{
return -1;
}
*(pcBuff + index) = tempdata;
index ++ ;
}
}
else if(nPort == 1)
{
}
else if(nPort == 2)
{
}
return 1;
}
/**
int select_portdata()
{
int flag=0;
int is_start=0;
int passdata_len=0;
int i=0;
unsigned char temp_buffer[1024]={0};
unsigned char passdata[fifo_recv_size]={0};
if(is_show_system != 1 && is_show_file_list != 1)
{
show_system_box();
}
LCD_DrawText(215,1,"串口通信",8,RGB(131,223,231),RGB(0,0,0));
delay(300);
flag=UART_RecvBuff(0,passdata,recv_fifobuf_t.now_size);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -