SCI1_UART.c 3.71 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
/******************************************************************************
文 件 名:SCI1_UART.c
功能描述:UART模式SCI1驱动库文件
作    者:张暄
版    本:V1.0
日    期:2016.11.17
******************************************************************************/

#include "SCI1_UART.h"

SCI1TxBufferStruct  SCI1TxBuffer;

//extern void Disp_Receive_Reply(uint8_t Data);

/******************************************************************************
函数名:SCI1_UART_Byte_Rx
功  能:UART字节接收函数
        在该函数中引用上层的接收函数,用于向上层指示已接收到数据,并传递数据Data
参  数:Data:接收到的数据
返回值:无
******************************************************************************/
void SCI1_UART_Byte_Rx(uint8_t Data)
{
   uint8_t Parity;

   Parity = SCI1SR1_PF; 
}

/******************************************************************************
函数名:SCI1_UART_Byte_Tx
功  能:UART字节发送函数
        立即发送一字节数据,调用此函数之前,必须确定发送Buffer是空的,否则可能造成
        发送数据的丢失
参  数:Data:将要发送的数据
返回值:无
******************************************************************************/
void SCI1_UART_Byte_Tx(uint8_t Data)
{
  SCI1DRL = Data;
}

/******************************************************************************
函数名:SCI1_UART_Block_Tx
功  能:UART块发送函数
        立即发送N字节数据,调用此函数之前,必须确定发送Buffer是空的,否则可能造成
        发送数据的丢失
参  数:Data:将要发送的数据
        Len :将要发送的数据长度
返回值:无
******************************************************************************/
void SCI1_UART_Block_Tx(uint8_t *Data, uint8_t Len)
{
  uint8_t i;

  SCI1TxBuffer.Len = Len - 1;
  for (i = 0; i < Len; i++)
    SCI1TxBuffer.Data[Len - i - 1] = Data[i];

  SCI1DRL = SCI1TxBuffer.Data[SCI1TxBuffer.Len];  //发送第一个字节
  SCI1CR2_TIE = 1;                                //使能发送Buffer空中断
}

/******************************************************************************
函数名:SCI1_UART_Get_Tx_Buffer_Status
功  能:获取发送Buffer的当前状态
参  数:无
返回值:0 - 目前没有数据在发送
        1 - 目前有数据在发送
******************************************************************************/
uint8_t SCI1_UART_Get_Tx_Buffer_Status(void)
{
  if ((SCI1SR1_TDRE != 0) && (SCI1TxBuffer.Len == 0))
    return 0;
  return 1;
}

/******************************************************************************
函数名:SCI1_UART_Init
功  能:初始化SCI1为UART模式,并配置于SCI1_UART.h中设置的UART参数
参  数:无
返回值:无
******************************************************************************/
void SCI1_UART_Init(void)
{
  SCI1TxBuffer.Len = 0;

  PTHRR   = SCI1_GPIO_SELECT;          //----hyq--20180711 IO映射

  SCI1BD  = SCI1_BAUD_RATE_REG;
  SCI1CR1 = SCI1_CFG_REG;

  if (SCI1SR1)        //读取SCI1SR1清各个中断标志位
    nop();

  SCI1CR2 = 0x2C;     //开接收中断,使能收发
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED   	//置所有中断函数放在FLASH的非分页区

/******************************************************************************
函数名:SCI1_ISR
功  能:SCI1中断服务函数,用于接收数据
参  数:无
返回值:无
******************************************************************************/
void interrupt SCI1_ISR(void)
{
  uint8_t SR1Reg;

  SR1Reg = SCI1SR1;

  if (SR1Reg & SCI1SR1_RDRF_MASK)         //如果接收到数据
  {
    SCI1_UART_Byte_Rx(SCI1DRL);
  }
  else if (SR1Reg & SCI1SR1_TDRE_MASK)    //如果上一次发送结束
  {
    if (SCI1TxBuffer.Len)                 //尚有数据没有发送完毕
    {
      SCI1TxBuffer.Len--;                 //发送下一个字节
      SCI1DRL = SCI1TxBuffer.Data[SCI1TxBuffer.Len];
    }
    else                                  //数据全部发送完毕
      SCI1CR2_TIE = 0;                    //关闭发送Buffer空中断
  }
}

#pragma CODE_SEG DEFAULT