This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
//###########################################################################
//
// FILE: Sci485.c
//
// TITLE: Sci485
//
// DESCRIPTION:
//
// Sci485
//
//###########################################################################
// $SMART LAB Release $
// $Release Date: Mon April 20 15:29:59 AEST 2015 $
//###########################################################################
#include "Board_GlobalPrototypes.h"
// 这里可扩展不同的485设备 //待发送的询问命令,二维数组的倒数第二位是接收到的数据长度,最后一位为命令长度。
unsigned char sciaTxBuf[3][10]={ 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, //无模块连接
0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0X0B,0X09,0X08, //天平
0x5A,0x01,0x0B,0x00,0x66,0X00,0X00,0X00,0X0E,0X05 }; //压差传感器
unsigned int moduleFlag = 2; //0表示无设备连接;1表示连接的天平;2表示连接的压差传感器
static unsigned char sciaRxBuf[30]; //串口中断接收数据缓存
unsigned int sciaReceiveNumber=0; //串口接收到数据的个数
unsigned int cur485StateFlag=0; //问询设备是否在线标志。初值为0,表示不在线(或数据丢失)。1表示在线
unsigned int last485StateFlag=0; //上一次的问询状态
unsigned int disConnectedNum=0; //设备在线状态问询计数器,到达一定次数后(没有回一次数据),判定设备不在线
/***************************************************************************************************************************************************
* Void Scia485ReceiveIsr(UArg arg)
* 功能:串口中断函数,处理Void clk2Fxn(UArg a0) 串口发送返回的数据
* 注意:离开中断必须清楚标志位
* 串口接收BUF为16位缓存器,数据位只有低八位
* 进中断后,再做一次中断标志位是否发生的判断,不明白,但通常都是这样的做法
***************************************************************************************************************************************************/
interrupt void Scia485ReceiveIsr(void) //485串口中断处理
{ //先检验是否有接收错误,如果没有,继续向下执行,如果有,则跳出中断
if (SciaRegs.SCIRXST.bit.RXERROR ==1) //当接收发生错误的时候,就会在这里面显示,并且立即重启SCI
{
//SA8CHStateRegs.SA8CHSTATE1.bit.SA8CHUSBRECEIVEERROR =1; //标识错误
//SciaRegs.SCICTL1.bit.SWRESET = 0; //reset一下SCI
//SciaRegs.SCICTL1.bit.SWRESET = 1;
}
//收到数据的个数小于30都算正常接收
//cur485StateFlag=1; //收到数据,说明设备在线
sciaRxBuf[sciaReceiveNumber] = SciaRegs.SCIRXBUF.bit.RXDT; // 只取寄存器的低八位赋值给接收缓冲器
sciaReceiveNumber++;
if(sciaReceiveNumber==9)
{
sciaReceiveNumber=0;
GpioDataRegs.GPBCLEAR.bit.GPIO51 = 1;
}
PieCtrlRegs.PIEACK.all=PIEACK_GROUP9;
}
void bsp_sciaUsb_xmit(Uint16 a)//发送单个字符8位
{
SciaRegs.SCITXBUF= a;
while(SciaRegs.SCICTL2.bit.TXEMPTY ==0);
}
void codexmit(unsigned char (*bufpoint)[10])//发送固定的字符串
{
unsigned char i;
for(i=0;i<bufpoint[1][9];i++)
bsp_sciaUsb_xmit(bufpoint[1][i]);
GpioDataRegs.GPBSET.bit.GPIO51 = 1;
}
#include "Board_GlobalPrototypes.h"
extern unsigned char sciaTxBuf[3][10];
void Scia485Init(void);
int main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.SCIRXINTA = &Scia485ReceiveIsr;//
PieCtrlRegs.PIEIER9.bit.INTx1=1;
EDIS;
IER=M_INT9;
EINT;
ERTM;
Scia485Init();
while(1)
{
if(GpioDataRegs.GPBDAT.bit.GPIO51==0)
codexmit(sciaTxBuf);
DELAY_US(5000000);
}
return 0;
}
void Scia485Init(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO29=1;//配置为复用引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//配置为复用引脚
GpioCtrlRegs.GPBMUX2.bit.GPIO51=0;//配置为通用引脚
GpioCtrlRegs.GPAPUD.bit.GPIO29=0;//配置为内部上拉
GpioCtrlRegs.GPAPUD.bit.GPIO28=0;//配置为内部上拉
GpioCtrlRegs.GPBPUD.bit.GPIO51=0;//配置为内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO29=1; //配置TX为输出
GpioCtrlRegs.GPADIR.bit.GPIO28=0; //配置RX为输入
GpioCtrlRegs.GPBDIR.bit.GPIO51=1; //配置控制脚输出
GpioCtrlRegs.GPAQSEL2.bit.GPIO28=3;
EDIS;
SciaRegs.SCICCR.bit.SCICHAR=7; //配置串口A为8位数据位
SciaRegs.SCICCR.bit.PARITYENA = 0; //无奇偶校验
SciaRegs.SCICCR.bit.STOPBITS =0; //一位停止位
SciaRegs.SCICCR.bit.LOOPBKENA = 0; //无循环检测
SciaRegs.SCICTL1.bit.TXENA = 1; //使能串口A发送
SciaRegs.SCICTL1.bit.RXENA = 1; //使能串口A接收,默认关闭睡眠模式,关闭接收错误中断
SciaRegs.SCICTL1.bit.RXERRINTENA =0; //不使能错误中断
SciaRegs.SCIHBAUD =0x01; // 9600 baud @LSPCLK = 24MHz (90 MHz SYSCLK).
SciaRegs.SCILBAUD =0x24; // 在外设时钟函数InitPeripheralClocks()中已经设置为22.5MHz
SciaRegs.SCICTL2.bit.TXINTENA =0; //禁止发送中断
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
// SciaRegs.SCICTL1.bit.RXERRINTENA=0; //禁止单独Buffer非FIFO的接收中断
// SciaRegs.SCIFFTX.bit.SCIRST=0; //复位FIFO通道,但不影响通道配置
// SciaRegs.SCIFFTX.bit.TXFFIL=4; //设置发送FIFO的深度为4
// SciaRegs.SCIFFTX.bit.TXFFIENA = 0; //禁止TXFIFO发送中断
// SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; //清除TXFIFO中断标志
// SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0; //将TXFIFO指针复位到0位置
// SciaRegs.SCIFFTX.bit.SCIFFENA =0; //使能FIFO缓存
//
//
// SciaRegs.SCIFFRX.bit.RXFFIL =1; //设置接收FIFO的深度为1
// SciaRegs.SCIFFRX.bit.RXFFIENA = 1; //使能RXFIFO接收中断
// SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; //清除RXFIFO中断标志
// SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将RXFIFO指针复位到0位置
// SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; //清除RXFIFO溢出标志
// SciaRegs.SCIFFCT.bit.FFTXDLY=0; //FIFO与移位寄存器间的传输延迟时间为0
// SciaRegs.SCIFFCT.bit.CDC=0; //禁用自动波特率对齐
SciaRegs.SCICTL1.bit.SWRESET = 1; //Relinquish SCI from Reset
// SciaRegs.SCIFFTX.bit.SCIRST = 1; //恢复FIFO通道
// SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1; //复位FIFO发送操作
// SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; //复位FIFO接收操作
GpioDataRegs.GPBCLEAR.bit.GPIO51 = 1; //485控制端置为发送状态
}