基本信息
源码名称:DS8007原厂示例代码
源码大小:0.07M
文件格式:.zip
开发语言:C/C++
更新时间:2019-01-13
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
DS8007原厂示例代码
DS8007原厂示例代码
/* -------------------------------------------------------------------------------- * Copyright (C) 2003-2007 Dallas Semiconductor Corporation, All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Dallas Semiconductor * shall not be used except as stated in the Dallas Semiconductor * Branding Policy. * -------------------------------------------------------------------------------- */ /********************************************************************************** * * Module Name : Serial library * Description : Serial library functions definition * Filename : Serial.c * Dependant Files : * intrins.h * Serial.h * * Author : Seeniraj G Naickar * Compiler : keil C51 Compiler V7.06 * Version : Version 1.0 * Created : 09-19-03 * Modifications : November 26, 2004 * Modified for using with DS8007 pass thru module. Removed all * 400 releated dependancies in the code. the code can be used * with any processor * - Ported for DS5250 processor * - Ported for DS5002 processor * Notes : * **********************************************************************************/ #include "common.h" #include "stdio.h" //include files #ifdef DS5250 #include "reg5240.h" #endif #ifdef DS89C390 #include "reg390.h" #endif #ifdef DS89C400 #include "reg400.h" #endif #ifdef DS5002 #include "reg5000.h" #endif #include "serial.h" #include <intrins.h> #ifdef DS5002 #undef SERIAL_CTS_0 #define SERIAL_CTS_0 1 #endif // the serial_port data structure includes buffers and additional data variables // needed to manage a serial port. typedef struct serial_port { unsigned char receive_buffer[BUF_SIZE]; //receive buffer unsigned char transmit_buffer[BUF_SIZE]; //transmit buffer unsigned int receive_writeindex; //receive buffer write index unsigned int receive_readindex; //receive buffer read index unsigned int transmit_writeindex; //transmit buffer write index unsigned int transmit_readindex; //transmit buffer read index unsigned char receive_emptystatus; //receive buffer empty status flag unsigned char transmit_emptystatus; //transmit buffer empty status flag unsigned char paritytype; //specifies parity serial_uartbaudrates currentbaudrate; //current baudrate value unsigned char isportopened; //flag indicates serialport configuration status unsigned char serialmode; //serial port mode unsigned char send_xon; //flag for ISR to send xon character unsigned char parity_err_flag; //indicates if parity error occurs } serial_port; #define XON 0x11 #define XOFF 0x13 #ifdef DS5002 //Serial driver global variables serial_port port0; #else //Serial driver global variables serial_port xdata port0; #endif long serial_baudrate[NUM_BAUD_RATES] = { 1200, 2400, 9600, 14400, 19200, 28800, 38400, 57600, 115200 }; #ifndef DS5002 extern void serial0_uartisr(void); extern int serial0_getchar(unsigned char *inchar); extern void isr_setinterruptvector(int vector_number, void* functionptr); #else int serial0_getchar(unsigned char *inchar); #endif /************************************************************************** * See serial.h header file for function description ***************************************************************************/ void serial0_enableinterruptflags() { port0.isportopened=0; port0.transmit_emptystatus=1; port0.receive_emptystatus=1; #ifdef DS5002 ES=1; #else //Enable Serial interrupt flag ES0=1; //Serial 0 interrupt #endif IP|=0x50; //Set Serial0 and Serial1 as high periority interrupts EA=1; //enable global interrupt flag return; } #ifdef DS5250 void serial_interrupt(void) interrupt ISR_SERIAL0 { serial0_uartisr(); } #endif /************************************************************************** * See serial.h header file for function description ***************************************************************************/ unsigned int serial_version(void) { return SERIAL_VERSION; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ void serial0_open() { //Initialize port variables port0.receive_writeindex=0; port0.receive_readindex=0; port0.transmit_writeindex=0; port0.transmit_readindex=0; port0.receive_emptystatus=1; port0.transmit_emptystatus=1; port0.paritytype=SERIAL_NO_PARITY; #ifdef PNP_SUPPORT port0.currentbaudrate=BAUD_RATE_1200; #else #ifdef DS5002 port0.currentbaudrate=BAUD_RATE_38400; #else port0.currentbaudrate=BAUD_RATE_115200; #endif #endif port0.isportopened=1; port0.serialmode=SERIAL_MODE1; //serial port mode port0.parity_err_flag=0; port0.send_xon=0; #ifndef DS5002 //Configure port0 to work at port0.currentbaudrate //10 bit serial 0, use timer baud rate, enable receiving SCON0=0x50; //RCAP2H,RCAP2L=65536-((OSCILLATOR_FREQ/2)/(16*baudrate)) RCAP2H=((0x10000-(OSCILLATOR_FREQ/(32 * serial_baudrate[port0.currentbaudrate])))/0x100); //Set timer2 reload low bye RCAP2L=((0x10000-(OSCILLATOR_FREQ/(32 * serial_baudrate[port0.currentbaudrate])))%0x100); T2CON=0x30; //Enable timer 2 for serial0 TR2=1; //Set timer 2 to run #endif #ifdef DS5002 TMOD = 0x21; TH1 =(char) (256-((OSCILLATOR_FREQ*2L)/(12*serial_baudrate[port0.currentbaudrate]*32L))); PCON|= 0x80; TCON|= 0x50; SCON= 0x50; TI=1; RI=0; #endif #ifndef DS5002 #ifndef DS5250 //Install Interrupt handler for Serial0 and initialize variables isr_setinterruptvector(ISR_SERIAL0, &serial0_uartisr); #endif #endif return; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ int serial0_setparameters(unsigned char param_type, unsigned int param_value ) { switch(param_type) { case SERIAL_MODE_TYPE: #ifdef DS5002 SCON=((((unsigned char)param_value)*64)|(SCON & 0x3F)); #else SCON0=((((unsigned char)param_value)*64)|(SCON0 & 0x3F)); #endif break; case SERIAL_BAUD_TYPE: #ifdef DS5002 TH1 = (256-((OSCILLATOR_FREQ*2)/(12*serial_baudrate[param_value]*32))); #endif #ifndef DS5002 TR2=0;//stop timer //Set timer2 reload high byte RCAP2H=((0x10000-(OSCILLATOR_FREQ/(32 * serial_baudrate[param_value])))/0x100); //Set timer2 reload low bye RCAP2L=((0x10000-(OSCILLATOR_FREQ/(32 * serial_baudrate[param_value])))%0x100); TR2=1;//start timer #endif break; case SERIAL_PARITY_TYPE: if(param_value!=SERIAL_NO_PARITY && param_value != SERIAL_ODD_PARITY \ && param_value != SERIAL_EVEN_PARITY) return SERIAL_ERR_INVALID_PARITY_TYPE; port0.paritytype=param_value; break; default: return SERIAL_ERR_VALUE_IS_NOT_SUPPORTED; } return SERIAL_STATUS_SUCCESS; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ int serial0_getparameters( unsigned char param_type, unsigned int *param_value ) { switch(param_type) { case SERIAL_MODE_TYPE: *param_value=port0.serialmode; break; case SERIAL_BAUD_TYPE: *param_value=port0.currentbaudrate; break; case SERIAL_PARITY_TYPE: *param_value=port0.paritytype; break; default: return SERIAL_ERR_VALUE_IS_NOT_SUPPORTED; } return SERIAL_STATUS_SUCCESS; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ int serial0_putchar(unsigned char outchar) { bit preservedie; if((port0.transmit_readindex-port0.transmit_writeindex==1) || \ (port0.transmit_writeindex-port0.transmit_readindex==BUF_SIZE-1)) { return SERIAL_ERR_BUFFER_IS_FULL; } port0.transmit_buffer[port0.transmit_writeindex] = outchar; preservedie=_testbit_(EA); // protect this section from the UART ISR port0.transmit_writeindex ; port0.transmit_writeindex %= BUF_SIZE ; if(port0.transmit_emptystatus) { port0.transmit_emptystatus=0; TI=1; } EA=preservedie;//restore old value of EA return SERIAL_STATUS_SUCCESS; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ int serial0_write(unsigned char *string, unsigned int num) { unsigned int count; count=0; do { if(serial0_putchar(string[count])==SERIAL_STATUS_SUCCESS) { count ; } }while(count<num); return SERIAL_STATUS_SUCCESS; } /************************************************************************** * See serial.h header file for function description ***************************************************************************/ int serial0_read(unsigned char *string, unsigned int num) { unsigned int count; count=0; do { if((serial0_getchar(&string[count]))==SERIAL_STATUS_SUCCESS) { count ; } }while(count<num); return SERIAL_STATUS_SUCCESS; } //Clears Serial0 receive buffer void serial0_flush(void) { EA=0; port0.receive_writeindex=0; port0.receive_readindex=0; port0.receive_emptystatus=1; EA=1; return; } //Returns 1 if serial transmit buffer is empty. returns zero otherwise char isserial_writebufferempty(void) { return port0.transmit_emptystatus; } #ifdef DS5002 int serial0_getchar(unsigned char *inchar) { unsigned int data val; bit preservedie; if(port0.receive_emptystatus) { return SERIAL_ERR_BUFFER_IS_EMPTY; } val = port0.receive_readindex; *inchar = port0.receive_buffer[val]; val ; val%=BUF_SIZE; preservedie=_testbit_(EA); // protect this section from the UART ISR if(val==port0.receive_writeindex) { port0.receive_emptystatus=1; } port0.receive_readindex=val; EA=preservedie;//restore old value of EA return SERIAL_STATUS_SUCCESS; } #endif #ifdef DS5002 static void serial0_uartisr(void) interrupt ISR_SERIAL0 { unsigned int data val; unsigned char data val1; if (RI) { RI=0; val1=SBUF; val=port0.receive_writeindex; port0.receive_buffer[val]=val1; if(val==port0.receive_readindex) { port0.receive_emptystatus=0; } val ;val%=BUF_SIZE; port0.receive_writeindex=val; } if (TI) { TI=0; val=port0.transmit_readindex; if(val!=port0.transmit_writeindex) { SBUF=port0.transmit_buffer[val]; val ;val%=BUF_SIZE; port0.transmit_readindex=val; if(port0.transmit_emptystatus==1) port0.transmit_emptystatus=0; } else { port0.transmit_emptystatus=1; } } return; } #endif