你现在位置:首页>技术论文>软件知识>正文
TI串口说明
日期:2010-12-27 14:09:36 点击:
来源:本站整理
作者:
点击【】放大字体.
协议栈版本:ZStack-1.4.3-1.2.1

一、串口的初始化

WWW_P※LCJS_CO※M-PLC-技-.术_网

//系统初始化

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

byte osal_init_system( void )

W1WW_P4LCJS_COM-PLC-技.术_网

{

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

……

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

osalInitTasks();//系统任务初始化

WWW_PLCJS@_COM%-PLC-技.术_网

……

WWW_P※LCJS_CO※M-PLC-技-.术_网

}

P.L.C.技.术.网——可编程控制器技术门户

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

//任务初始化

WWW_PL※CJS_COM-PLC-技.术_网

void osalInitTasks( void )

——可——编——程——控-制-器-技——术——门——户

{

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

……

plcjs.技.术_网

#if defined( MT_TASK )//如果定义了MT_TASK就初始化MT任务,所以要使用uart必须编译MT_TASK

WWW_PLC※JS_COM-PmLC-技.术_网

MT_TaskInit( taskID );

WWW_P※LCJS_COM-PLC-)技.术_网

#endif

WW.W_PLCJS_COM-PLC-技.术_网

……

WWW_P※LCJS_COM-PLC-)技.术_网

}

WW.W_PLC※JS_C,OM-PL,C-技.术_网

//MT_TASK初始化

WWW_PL※CJS_COM-PLC-技.术_网

void MT_TaskInit( byte task_id )

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

{

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

MT_TaskID = task_id;//分配任务ID

WWW_P※LCJS_COM-PLC-)技.术_网

……

W1WW_P4LCJS_COM-PLC-技.术_网

SPIMgr_Init();//SPI(UART)管理初始化

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_P※LCJS_CO※M-PLC-技-.术_网

WW.W_PLCJS_COM-PLC-技.术_网

} /* MT_TaskInit() */

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

——可——编——程——控-制-器-技——术——门——户

WW.W_PLCJS_COM-PLC-技.术_网

//SPI(UART)管理初始化

——可——编——程——控-制-器-技——术——门——户

void SPIMgr_Init ()

WWW_PL※CJS_COM-PLC-技.术_网

{

WWcW_PLCJS_COM-PLC-技.术_网

halUARTCfg_t uartConfig;

WWW_PLCJS_COM-PLC-技.术_网

/* Initialize APP ID */

——可——编——程——控-制-器-技——术——门——户

App_TaskID = 0;//应用层TaskID初始化为0,在后面应用层如果想使用uart需要注册该TaskID

WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

/* UART Configuration */

WWcW_PLCJS_COM-PLC-技.术_网

uartConfig.configured = TRUE;

P.L.C.技.术.网——可编程控制器技术门户

uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;

WW.W_PLC※JS_C,OM-PL,C-技.术_网

uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;

WWcW_PLCJS_COM-PLC-技.术_网

uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;

WWW_PLC※JS_COM-PmLC-技.术_网

uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;

——可——编——程——控-制-器-技——术——门——户

uartConfig.intEnable = TRUE;

WWW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

#if defined (ZTOOL_P1) || defined (ZTOOL_P2)

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

uartConfig.callBackFunc = SPIMgr_ProcessZToolData; //回调函数

P.L.C.技.术.网——可编程控制器技术门户

#elif defined (ZAPP_P1) || defined (ZAPP_P2)

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

uartConfig.callBackFunc = SPIMgr_ProcessZAppData; //回调函数

WWW_PLCJS@_COM%-PLC-技.术_网

#else

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

uartConfig.callBackFunc = NULL;

WW.W_PLC※JS_C,OM-PL,C-技.术_网

#endif

WWW_PLCJS@_COM%-PLC-技.术_网

/* Start UART */

W1WW_P4LCJS_COM-PLC-技.术_网

#if defined (SPI_MGR_DEFAULT_PORT)

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig); //打开默认串口

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

#else

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

……

WWW_P※LCJS_CO※M-PLC-技-.术_网

}

WW.W_PLCJS_COM-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

plcjs.技.术_网

WWW_PLCJS_COM-PLC-技.术_网

到这里串口的初始化基本就完成了,还有个打开串口,先不下去了,下面的水是越来越浑,过几天总结底层的…

WWW_P※LCJS_CO※M-PLC-技-.术_网

二、串口的事件处理

WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJS_COM-PLC-技.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

//系统主循环

plcjs.技.术_网

void osal_start_system( void )

WW.W_PLC※JS_C,OM-PL,C-技.术_网

{

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

……

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

Hal_ProcessPoll(); // 串口与定时器轮询函数

WWW_PLCJS_COM-PLC-技.术_网

……

WWcW_PLCJS_COM-PLC-技.术_网

}

P.L.C.技.术.网——可编程控制器技术门户

WWW_PL※CJS_COM-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

// 串口与定时器轮询函数

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

void Hal_ProcessPoll ()

WWW_P※LCJS_COM-PLC-)技.术_网

{

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

HalTimerTick();

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW.PLCJS.COM——可编程控制器技术门户

#if (defined HAL_UART) && (HAL_UART == TRUE)

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

HalUARTPoll();

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

#endif

WWW_P※LCJS_CO※M-PLC-技-.术_网

}

WWW.PLCJS.COM——可编程控制器技术门户

plcjs.技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

//串口轮询函数

P.L.C.技.术.网——可编程控制器技术门户

void HalUARTPoll( void )

WWcW_PLCJS_COM-PLC-技.术_网

{

WW.W_PLC※JS_C,OM-PL,C-技.术_网

……//这里会根据是DMA还是普通串口有两种不同的轮询方式,这里说普通串口

WWW.PLCJS.COM——可编程控制器技术门户

#if HAL_UART_ISR

WWcW_PLCJS_COM-PLC-技.术_网

#if HAL_UART_DMA

WWW_PLCJS_COM-PLC-技.术_网

if ( cfg->flag & UART_CFG_DMA )

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

{

WWcW_PLCJS_COM-PLC-技.术_网

pollDMA( cfg );

WW.W_PLCJS_COM-PLC-技.术_网

}

WWW_PL※CJS_COM-PLC-技.术_网

else

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

#endif

WWW_PLCJS_COM-PLC-技.术_网

{

WWW_PLC※JS_COM-PmLC-技.术_网

pollISR( cfg );

WWW_PLC※JS_COM-PmLC-技.术_网

}

P.L.C.技.术.网——可编程控制器技术门户

#elif HAL_UART_DMA

WWW_PL※CJS_COM-PLC-技.术_网

pollDMA( cfg );

W1WW_P4LCJS_COM-PLC-技.术_网

#endif

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

……

WWcW_PLCJS_COM-PLC-技.术_网

}

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//普通串口轮询函数

WWW.PLCJS.COM——可编程控制器技术门户

static void pollISR( uartCfg_t *cfg )

WW.W_PLCJS_COM-PLC-技.术_网

{

WWW.PLCJS.COM——可编程控制器技术门户

……

WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

轮询完事再次回到void HalUARTPoll函数中,看是否触发事件,如果触发了HAL_UART_RX_FULLHAL_UART_RX_ABOUT_FULLHAL_UART_RX_TIMEOUT三个中任意一个就调用回调函数处理。

P.L.C.技.术.网——可编程控制器技术门户

WWW_P※LCJS_COM-PLC-)技.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

if ( evt && cfg->rxCB )

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

{

——可——编——程——控-制-器-技——术——门——户

cfg->rxCB( ((cfg->flag & UART_CFG_U1F)!=0), evt );

WWW.PLCJS.COM——可编程控制器技术门户

}

WW.W_PLCJS_COM-PLC-技.术_网

plcjs.技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

//串口回调函数

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

#define SPI_MGR_ZAPP_RX_READY 0x01

WWW_PLCJS_COM-PLC-技.术_网

SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;

WWcW_PLCJS_COM-PLC-技.术_网

函数

plcjs.技.术_网

void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )

——可——编——程——控-制-器-技——术——门——户

{

W1WW_P4LCJS_COM-PLC-技.术_网

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

——可——编——程——控-制-器-技——术——门——户

osal_event_hdr_t *msg_ptr;

WWcW_PLCJS_COM-PLC-技.术_网

uint16 length = 0;

WWW_PLC※JS_COM-PmLC-技.术_网

uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

//获取串口buf中数据的长度

WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

……

WW.W_PLC※JS_C,OM-PL,C-技.术_网

if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))

WWcW_PLCJS_COM-PLC-技.术_网

{

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

if ( App_TaskID )//必须这里被注册

WW.W_PLCJS_COM-PLC-技.术_网

{

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

// 准备向上层发送数据

WW.W_PLCJS_COM-PLC-技.术_网

//如果接收状态为READY,并且数据长度大于0说明有数据了

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0))

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

{

WWW_PLCJS@_COM%-PLC-技.术_网

/*要读取这些数据了,先关闭接收!*/

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );

WW.W_PLCJS_COM-PLC-技.术_网

——可——编——程——控-制-器-技——术——门——户

W1WW_P4LCJS_COM-PLC-技.术_网

/* 2 more bytes are added, 1 for CMD type, other for length */

——可——编——程——控-制-器-技——术——门——户

msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length sizeof(osal_event_hdr_t) );

本新闻共2页,当前在第11 2  
WWW_P※LCJS_COM-PLC-)技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行