Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №2
„Використання модуля UART для зв’язку з комп'ютером”
Виконав
студент групи СКС-5
.
Львів-2004
Мета роботи Ознайомитись з модулем UART.
Теоретичні відомості.
Особливості і Короткий Огляд
• Асинхронний одержувач і відправник
• Формат даних сумісний з послідовним форматом даних RS-232.
• Норма передачі до 6 Mbits/second
• Пакет даних складається з старту, перевірки парності, і бітів зупинки
• Масковане переривання при отриманні регістр переповнений і/або буфер передачі порожній
• Парність, вихід за межі, і виявлення помилки в пакетах.
• Функції передачі і прийому на високому рівні.
Модуль UART - це 8-розрядний універсальний асинхронний приймач передавач який підтримує дуплексний режим сумісний з RS-232, і послідовну передачу даних по двох і більше лініях.Підтримується програмоване тактування і масковані переривання.Функції API дозволяють ініціалізувати, конфігурувати і працювати з модулем UART. Додатковий високорівневий API підтримує роботу з рядками
Функціональний Опис
Модуль UART включає послідовні приймач і передавач.В PSoC UART розділений на два блоки, які реалізують TX і RX, в Редакторі Пристрою PSoC. Блок TX PSoC забезпечує функціональність передавача і блок RX PSoC забезпечує функціональність приймача.RX і TX діять незалежно. Кожний має свій власний регістр статусу, контроль, програмоване переривання, в/в, буферний регістр, і регістр зсуву. Вони розділяють сигнал дозволу, тактування, і формат даних.
Установка біту дозволу в регістрах контролю RX і TX включає UART.
Дозвіл і блокування виконується, використовуючи функції API.
Сигнал тактування в модулі UART є спільним для RX і TX. Частота тактування
Має бути у вісім разів більша частоти передачі розряду даних.Частота конфігурується використовуючи Редактора Пристрою Конструктора PSoC.
Дані отримані і передані є потік бітів який складається з стартового біта, вісім розрядів даних, контроль парності, і бітів зупинки.. Як RX так і TX є набором до тієї ж конфігурації паритету.
Текст програми.
include "m8c.inc"
include "memory.inc"
include "UART_2.inc"
export UART_2_SetTxIntMode
export _UART_2_SetTxIntMode
export UART_2_EnableInt
export _UART_2_EnableInt
export UART_2_DisableInt
export _UART_2_DisableInt
export UART_2_Start
export _UART_2_Start
export UART_2_Stop
export _UART_2_Stop
export UART_2_SendData
export _UART_2_SendData
export UART_2_bReadTxStatus
export _UART_2_bReadTxStatus
export UART_2_bReadRxData
export _UART_2_bReadRxData
export UART_2_bReadRxStatus
export _UART_2_bReadRxStatus
export UART_2_IntCntl
export _UART_2_IntCntl
export UART_2_TxIntMode
export _UART_2_TxIntMode
export UART_2_PutSHexByte
export _UART_2_PutSHexByte
export UART_2_PutSHexInt
export _UART_2_PutSHexInt
export UART_2_CPutString
export _UART_2_CPutString
export UART_2_PutString
export _UART_2_PutString
export UART_2_PutChar
export _UART_2_PutChar
export UART_2_Write
export _UART_2_Write
export UART_2_CWrite
export _UART_2_CWrite
export UART_2_cGetChar
export _UART_2_cGetChar
export UART_2_cReadChar
export _UART_2_cReadChar
export UART_2_iReadChar
export _UART_2_iReadChar
export UART_2_PutCRLF
export _UART_2_PutCRLF
IF (UART_2_RXBUF_ENABLE)
export UART_2_CmdReset
export _UART_2_CmdReset
export UART_2_bCmdCheck
export _UART_2_bCmdCheck
export UART_2_bCmdLength
export _UART_2_bCmdLength
export UART_2_bErrCheck
export _UART_2_bErrCheck
export UART_2_szGetParam
export _UART_2_szGetParam
export UART_2_szGetRestOfParams
export _UART_2_szGetRestOfParams
ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WARNING WARNING WARNING
; The following exports are for backwards compatibility only and should
; not be used for new designs. They may be eliminated in a future release.
; Their status is "NO FURTHER MAINTENANCE".
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
export bUART_2_ReadTxStatus
export _bUART_2_ReadTxStatus
export bUART_2_ReadRxData
export _bUART_2_ReadRxData
export bUART_2_ReadRxStatus
export _bUART_2_ReadRxStatus
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; END WARNING
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
IF (UART_2_RXBUF_ENABLE)
area UART_2_RAM (RAM, REL, CON)
ptrParam: BLK 1
ENDIF
area text (ROM,REL)
;-----------------------------------------------
; EQUATES
;-----------------------------------------------
bfCONTROL_REG_START_BIT: equ 1 ; Control register start bit
bfFUNCTION_REG_TX_INT_MODE_BIT: equ 0x10 ; the TX Int Mode bit
area UserModules (ROM, REL, CON)
;
UART_2_EnableInt:
_UART_2_EnableInt:
RAM_PROLOGUE RAM_USE_CLASS_1
M8C_EnableIntMask UART_2_TX_INT_REG, UART_2_TX_INT_MASK
M8C_EnableIntMask UART_2_RX_INT_REG, UART_2_RX_INT_MASK
RAM_EPILOGUE RAM_USE_CLASS_1
ret
.ENDSECTION
include "UART_2.inc"
include "memory.inc"
include "m8c.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
export _UART_2_TX_ISR
export _UART_2_RX_ISR
IF (UART_2_RXBUF_ENABLE)
export UART_2_aRxBuffer
export _UART_2_aRxBuffer
export UART_2_bRxCnt
export _UART_2_bRxCnt
export UART_2_fStatus
export _UART_2_fStatus
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)
IF (UART_2_RXBUF_ENABLE)
UART_2_fStatus:
_UART_2_fStatus: BLK 1
UART_2_bRxCnt:
_UART_2_bRxCnt: BLK 1
AREA UART_2_RAM (RAM, REL, CON)
UART_2_aRxBuffer:
_UART_2_aRxBuffer: BLK UART_2_RX_BUFFER_SIZE
ENDIF
AREA InterruptRAM (RAM, REL, CON)
;@PSoC_UserCode_INIT@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom declarations below this banner
;---------------------------------------------------
;------------------------
; Includes
;------------------------
;------------------------
; Constant Definitions
;------------------------
;------------------------
; Variable Allocation
;------------------------
;---------------------------------------------------
; Insert your custom declarations above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
AREA UserModules (ROM, REL, CON)
;-----------------------------------------------------------------------------
; FUNCTION NAME: _UART_2_TX_ISR
;
; DESCRIPTION:
; UART TX interrupt handler for instance UART_2.
;
; This is a place holder function. If the user requires use of an interrupt
; handler for this function, then place code where specified.
;-----------------------------------------------------------------------------
_UART_2_TX_ISR:
;@PSoC_UserCode_BODY_1@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom code below this banner
;---------------------------------------------------
; NOTE: interrupt service routines must preserve
; the values of the A and X CPU registers.
;---------------------------------------------------
; Insert your custom code above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
reti
;-----------------------------------------------------------------------------
; FUNCTION NAME: _UART_2_RX_ISR
;
; DESCRIPTION:
; UART RX interrupt handler for instance UART_2.
; This ISR handles the background processing of received characters if
; the buffer is enabled.
;
;
; The following assumes that the RX buffer feature has been enabled.
;
; SIDE EFFECTS:
; There are 3 posible errors that may occur with the serial port.
; 1) Parity Error
; 2) Framing Error
; 3) OverRun Error
;
; This user module check for parity and framing error. If either of these
; two errors are detected, the data is read and ignored. When an overRun
; error occurs, the last byte was lost, but the current byte is valid. For
; this reason this error is ignored at this time. Code could be added to
; this ISR to set a flag if an error condition occurs.
;
; THEORY of OPERATION:
; When using the RX buffer feature, the ISR collects received characters
; in a buffer until the user defined command terminator is detected. After
; the command terminator is detected, the command bit is set and all other
; characters will be ignored until the command bit is reset. Up to
; buffer_size - 1 characters will be collected waiting for a command
; terminator. After that, the characters will be discarded, although
; a command determinator will still cause the command bit to be set.
;
;-----------------------------------------------------------------------------
_UART_2_RX_ISR:
;@PSoC_UserCode_BODY_2@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom code below this banner
;---------------------------------------------------
; NOTE: interrupt service routines must preserve
; the values of the A and X CPU registers.
;---------------------------------------------------
; Insert your custom code above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
IF (UART_2_RXBUF_ENABLE)
push A
push X
IF SYSTEM_LARGE_MEMORY_MODEL
REG_PRESERVE IDX_PP
ENDIF
mov X,[UART_2_bRxCnt] ; Load X with byte counter
mov A,REG[UART_2_RX_CONTROL_REG] ; Read the control register
push A ; Store copy for later test
; IF real RX interrupt
and A,UART_2_RX_REG_FULL ; Did really really get an IRQ
jnz .UARTRX_ReadRx ; Data ready, go get it
pop A ; Restore stack
jmp .RESTORE_IDX_PP
.UARTRX_ReadRx:
pop A ; Restore status flags
; IF there is no error, get data
; Check for parity or framing error
and A,UART_2_RX_ERROR
jz .UARTRX_NO_ERROR ; If there is not an Error go read data
or [UART_2_fStatus],A ; Set error flags (parity,framing,overrun) bits
mov A,REG[UART_2_RX_BUFFER_REG ] ; Read the data buffer to clear it.
and A,UART_2_RX_FRAMING_ERROR ; Check for framing error special case
jz .RESTORE_IDX_PP ; Not framing error, all done
; Disable and re-enable RX to reset after
; framing error.
and REG[UART_2_RX_CONTROL_REG], ~UART_2_RX_ENABLE ; Disable RX
or REG[UART_2_RX_CONTROL_REG], UART_2_RX_ENABLE ; Enable RX
jmp .RESTORE_IDX_PP ; Done with framing error, leave.
.UARTRX_NO_ERROR:
mov A,REG[UART_2_RX_BUFFER_REG ] ; Read the data buffer
; IF buffer not full
tst [UART_2_fStatus],UART_2_RX_BUF_CMDTERM ; Check for buffer full
jnz .RESTORE_IDX_PP ; All done
cmp A,UART_2_CMD_TERM ; Check for End of command
jnz .UARTRX_CHK_CTLCHAR
or [UART_2_fStatus],UART_2_RX_BUF_CMDTERM ; Set command ready bit
RAM_SETPAGE_IDX >UART_2_aRxBuffer
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_10b
mov [X + UART_2_aRxBuffer],00h ; Zero out last data
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_00b
jmp .RESTORE_IDX_PP
.UARTRX_CHK_CTLCHAR: ; Ignore charaters below this value
; If ignore char is set to 0x00, do not
; ignore any characters.
IF(UART_2_RX_IGNORE_BELOW)
cmp A,UART_2_RX_IGNORE_BELOW
jc .RESTORE_IDX_PP
ENDIF
.UARTRX_CHK_OVFL: ; Check for MAX String here
RAM_SETPAGE_IDX >UART_2_aRxBuffer ; using idexed address mode
cmp [UART_2_bRxCnt],(UART_2_RX_BUFFER_SIZE - 1)
jc .UARTRX_ISR_GETDATA
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_10b
mov [X + UART_2_aRxBuffer],00h ; Zero out last data in the buffer
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_00b
or [UART_2_fStatus],UART_2_RX_BUF_OVERRUN ; Set error flags (parity,framing,overrun) bits
jmp .RESTORE_IDX_PP
.UARTRX_ISR_GETDATA: ; IF input data == "CR", then end of command
; X is already loaded with pointer
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_10b
mov [X+UART_2_aRxBuffer],A ; store data in array
RAM_CHANGE_PAGE_MODE FLAG_PGMODE_00b
inc X ; Inc the pointer
mov [UART_2_bRxCnt],X ; Restore the pointer
; ENDIF max string size
.RESTORE_IDX_PP:
IF SYSTEM_LARGE_MEMORY_MODEL
REG_RESTORE IDX_PP
ENDIF
.END_UARTRX_ISR:
pop X
pop A
ENDIF
UART_2_RX_ISR_END:
reti
Висновок
Під час лабораторної роботи я дрслідив роботу модуля UART