簡簡單單----一個TMS320F28035的串口驅動程序

/************************************
    標題:MySci.h
    軟件平臺:CCS v5.2
    硬件平臺:TMS320F28035coreboard
    主頻:60M
    歡迎光臨
    http://greatech.taobao.com
    author:小船
    data:2013-01-22
*************************************/
#ifndef MySci_H_
#define MySci_H_

#include "PeripheralHeaderIncludes.h"
#include <stdbool.h>

#define RECEIVER_BUFF_SIZE 50

struct Sci_send_data{
	char *AddPtr;
	char length;
};

extern char receiver_counter;
extern struct Sci_send_data data;
extern char receiver_data_buff[RECEIVER_BUFF_SIZE];

void MySci_init();
bool MySci_send(char *Ptr,char length);

#endif /* MySci_H_ */


/************************************
    標題:MySci.c
    軟件平臺:CCS v5.2
    硬件平臺:TMS320F28035coreboard
    主頻:60M

       描述:串口通信,波特率38400,自動中斷髮送,不必多餘的等待
	注意:如果用fifo,就不用判斷SciaRegs.SCIRXST.bit.RXRDY,此位不會生效
      基於2803x C/C++ Header Files V1.21
	歡迎
	http://greatech.taobao.com
    author:小船
    data:2013-01-22
*************************************/
#include"MySci.h"

struct Sci_send_data data;
char receiver_data_buff[RECEIVER_BUFF_SIZE];
char receiver_counter = 0;

interrupt void rece_isr();
interrupt void tx_isr();

void MySci_init()
{
	/*配置GPIO*/
	   EALLOW;
	   GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;    // Enable pull-up for GPIO28 (SCIRXDA)
	   GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;	   // Enable pull-up for GPIO29 (SCITXDA)
	   GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // Asynch input GPIO28 (SCIRXDA)
	   GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;   // Configure GPIO28 for SCIRXDA operation
	   GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;   // Configure GPIO29 for SCITXDA operation
	   EDIS;

	 /*配置fifo*/
	   SciaRegs.SCIFFTX.all=0xC060;
	   SciaRegs.SCIFFRX.all=0x0021;  //fifo接收到一個字節就中斷
	   SciaRegs.SCIFFCT.all=0x0;

	 /*配置sci*/
	   SciaRegs.SCICCR.all = 0x0007;   // 1 stop bit,  No loopback
	                                   // No parity,8 char bits,
	                                   // async mode, idle-line protocol
	   SciaRegs.SCICTL1.all = 0x0063;  // enable TX, RX, RX ERR internal SCICLK,
	                                   // Disable SLEEP, TXWAKE
	   //SciaRegs.SCICTL2.bit.TXINTENA = 1;
	   SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
	   SciaRegs.SCIHBAUD    = 0x0000;  // 38400 baud @LSPCLK = 15MHz (60 MHz SYSCLK).
	   SciaRegs.SCILBAUD    = 0x0030;

	   SciaRegs.SCICTL1.all = 0x0063;  // Relinquish SCI from Reset
	   SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
	   SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

	   /*配置中斷*/
	   EALLOW;
	   PieVectTable.SCITXINTA = &tx_isr; //註冊中斷向量表
	   PieVectTable.SCIRXINTA = &rece_isr;
	   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   //使能PIE
	   PieCtrlRegs.PIEIER9.bit.INTx1=1;     //使能int9.1
	   PieCtrlRegs.PIEIER9.bit.INTx2=1;     //使能int9.2
	   IER |= (1<<8);//使能int9
	   EINT;
	   EDIS;

	   data.length=0;
	   data.AddPtr=0;
}

bool MySci_send(char *Ptr,char length)
{
	if(SciaRegs.SCIFFTX.bit.TXFFIENA==1)
		return false;
	else
	{
		data.AddPtr = Ptr;
		data.length = length;
		SciaRegs.SCIFFTX.bit.TXFFIENA=1;
	}
	return true;
}

interrupt void tx_isr()
{
	if( data.length)
	{
		SciaRegs.SCITXBUF = *data.AddPtr++;
		data.length--;
	}
	else
		SciaRegs.SCIFFTX.bit.TXFFIENA=0;
	SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;
	PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}

interrupt void rece_isr()
{
	if(SciaRegs.SCIRXST.bit.RXERROR)
	{
		while(1);
	}
	if( receiver_counter != RECEIVER_BUFF_SIZE)
		receiver_data_buff[receiver_counter++] = SciaRegs.SCIRXBUF.bit.RXDT;

	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
	PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章