TI中文支持网
TI专业的中文技术问题搜集分享网站

求一个msp430f5438A的irda demo code

如题求一个红外传输例程,找好久没找到,TI的官方例程里也没找到

Susan Yang:

目前没有直接的例程,但是给出了相关的文档,您可以参考一下

另外有客户分享了之前的程序,您也可以参考一下

usci_a_uart_IrDA.c

/* --COPYRIGHT--,BSD* Copyright (c) 2017, Texas Instruments Incorporated* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** *Redistributions of source code must retain the above copyright*notice, this list of conditions and the following disclaimer.** *Redistributions in binary form must reproduce the above copyright*notice, this list of conditions and the following disclaimer in the*documentation and/or other materials provided with the distribution.** *Neither the name of Texas Instruments Incorporated nor the names of*its contributors may be used to endorse or promote products derived*from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.* --/COPYRIGHT--*/
#include "driverlib.h"//******************************************************************************
//! This example shows how to configure the UART module to echo a received
//! character. To echo a received character, RX ISR is used.
//!
//!MSP430F6638
//!-----------------
//!/|\||
//!| ||
//!--|RST|
//!||
//!|P2.4/UCA0TXD|------------>
//!|| 9600
//!|P2.5/UCA0RXD|<------------
//!
//!
//! This example uses the following peripherals and I/O signals.You must
//! review these and change as needed for your own board:
//! - UART peripheral
//! - GPIO Port peripheral (for UART pins)
//! - UCA0TXD
//! - UCA0RXD
//!
//! This example uses the following interrupt handlers.To use this example
//! in your own application you must add these interrupt handlers to your
//! vector table.
//! - USCI_A0_VECTOR.
//******************************************************************************#define BAUD_RATE9600
#define RECEIVE_DATA_COUNT0x02
#define USCI_A_UART_MULTIPROCESSOR_MODE_ADDRESS0xAA#define UCS_XT2_TIMEOUT 50000//Desired Timeout for XT2 initialization
#define UCS_XT1_CRYSTAL_FREQUENCY32768//XT1 Crystal Frequency being used
#define UCS_XT2_CRYSTAL_FREQUENCY4000000//XT2 Crystal Frequency being useduint8_t returnValue = 0;//Variable to store returned STATUS_SUCCESS or STATUS_FAILuint8_t receivedData = 0x00;
uint8_t receiveDataCount = 0x00;void Init_Clock(void);void Init_UART(void);void Init_IrDA (void);void main (void)
{//Stop WDTWDT_A_hold(WDT_A_BASE);Init_Clock();//Init_UART();Init_IrDA();__bis_SR_register(GIE);while(1){USCI_A_UART_transmitData(USCI_A0_BASE,'M');}}//******************************************************************************
//
//Function definition .
//
//******************************************************************************void Init_Clock(void)
{/**********Clock Setup***************************************///Port select HF XT2GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P7,GPIO_PIN2 + GPIO_PIN3);//Initializes the XT1 and XT2 crystal frequencies being usedUCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY,UCS_XT2_CRYSTAL_FREQUENCY);//Initialize XT2. Returns STATUS_SUCCESS if initializes successfullyreturnValue = UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,UCS_XT2_TIMEOUT);//Select XT2 as SMCLK sourceUCS_initClockSignal(UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);/********End**************************************************/
}void Init_UART(void)
{/**********UART 1 --> USCI_A0__________Start*****************///----------BR 9600 @ 4MHz---------------------------//Baudrate = 9600, clock freq = 4MHz//UCBRx = 26, UCBRFx = 10, UCBRSx = 6, UCOS16 = 1USCI_A_UART_initParam param = {0};param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;param.clockPrescalar = 26;param.firstModReg = 10;param.secondModReg = 0xD6;param.parity = USCI_A_UART_NO_PARITY;param.msborLsbFirst = USCI_A_UART_LSB_FIRST;param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;param.uartMode = USCI_A_UART_ADDRESS_BIT_MULTI_PROCESSOR_MODE;param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//---------------------------------------------------//Initialize USCI_A0 UARTUSCI_A_UART_init(USCI_A0_BASE, &param);
//if ( STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, &param))
//{
//return;
//}//P2.4,5 = USCI_A0 TXD/RXDGPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN4 + GPIO_PIN5);//Enable UART module for operationUSCI_A_UART_enable(USCI_A0_BASE);//---------Rx_Interrupt-----------------//Enable Receive InterruptUSCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);//------------------------------------/**********UART 1 --> USCI_A0___________End******************//**********UART 2 --> USCI_A1__________Start*****************///-----------BR 9600 @ 4MHz-----------------//Baudrate = 9600, clock freq = 4MHz//UCBRx = 26, UCBRFx = 10, UCBRSx = 6, UCOS16 = 0USCI_A_UART_initParam param2 = {0};param2.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;param2.clockPrescalar = 26;param2.firstModReg = 10;param2.secondModReg = 0xD6;param2.parity = USCI_A_UART_NO_PARITY;param2.msborLsbFirst = USCI_A_UART_LSB_FIRST;param2.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;param2.uartMode = USCI_A_UART_ADDRESS_BIT_MULTI_PROCESSOR_MODE;param2.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//-----------------------------------------//Initialize USCI_A1 UARTUSCI_A_UART_init(USCI_A1_BASE, &param2);
//if ( STATUS_FAIL == USCI_A_UART_init(USCI_A1_BASE, &param2))
//{
//return;
//}//P8.2,3 = USCI_A1 TXD/RXDGPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P8,GPIO_PIN2 + GPIO_PIN3);//Enable UART module for operationUSCI_A_UART_enable(USCI_A1_BASE);//---------Rx_Interrupt-----------------//Enable Receive InterruptUSCI_A_UART_clearInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);USCI_A_UART_enableInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);//------------------------------------/**********UART 2 --> USCI_A1__________End*****************/}void Init_IrDA (void)
{//P2.4,5 = USCI_A0 TXD/RXDGPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2,GPIO_PIN4 + GPIO_PIN5);// Enable IrDAUCA0IRCTL |= UCIREN;// Disable eUSCI_AUSCI_A_UART_disable(USCI_A0_BASE);// Set UCSWRST bit// IrDA encoder/decoder enabledHWREG16(USCI_A0_BASE + OFS_UCAxIRTCTL) |= UCIREN;// Transmit pulse clock source BITCLK16 (16 * 1/16 clock fractions)// HWREG16(USCI_A1_BASE + OFS_UCAxMCTLW) |= UCOS16;// Oversampling mode enabledHWREG16(USCI_A0_BASE + OFS_UCAxIRTCTL) |= UCIRTXCLK;// Select BITCLK16// Transmit pulse length 3/16 bit period (6 half clock cycles)// Set UCIRTXPLx to 5HWREG16(USCI_A0_BASE + OFS_UCAxIRTCTL) |= UCIRTXPL2 | UCIRTXPL0;// b101//----------BR 9600 @ 4MHz---------------------------//Baudrate = 9600, clock freq = 4MHz//UCBRx = 26, UCBRFx = 10, UCBRSx = 6, UCOS16 = 1USCI_A_UART_initParam param = {0};param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;param.clockPrescalar = 26;param.firstModReg = 10;param.secondModReg = 0xD6;param.parity = USCI_A_UART_NO_PARITY;param.msborLsbFirst = USCI_A_UART_LSB_FIRST;param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;param.uartMode = USCI_A_UART_ADDRESS_BIT_MULTI_PROCESSOR_MODE;param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//---------------------------------------------------//Initialize USCI_A0 UARTUSCI_A_UART_init(USCI_A0_BASE, &param);
//if ( STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, &param))
//{
//return;
//}// Enable eUSCI_AUSCI_A_UART_enable(USCI_A0_BASE);// Clear UCSWRST bit//---------Rx_Interrupt-----------------//Enable Receive InterruptUSCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);}//******************************************************************************
//
//This is the USCI_A0 interrupt vector service routine.
//
//******************************************************************************#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(USCI_A0_VECTOR)))
#endif
void USCI_A0_ISR (void)
{switch (__even_in_range(UCA0IV,4)){//Vector 2 - RXIFGcase 2://Receive the datareceivedData = USCI_A_UART_receiveData(USCI_A0_BASE);//Send data back "echo"USCI_A_UART_transmitData(USCI_A0_BASE,receivedData);break;default: break;}
}//******************************************************************************
//
//This is the USCI_A1 interrupt vector service routine.
//
//******************************************************************************#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A1_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(USCI_A1_VECTOR)))
#endif
void USCI_A1_ISR (void)
{switch (__even_in_range(UCA1IV,4)){//Vector 2 - RXIFGcase 2://Receive the datareceivedData = USCI_A_UART_receiveData(USCI_A1_BASE);//Send data back "echo"USCI_A_UART_transmitData(USCI_A1_BASE,receivedData);break;default: break;}
}

,

user6352220:

thank you!

,

Susan Yang:

很高兴能帮到您!

,

user6352220:

附上5438A的 IrDa驱动代码红外模块选用TFDU4101

//红外传输功能
static void IrDAInit (void)
{//引脚复用UARTP3SEL|=(BIT4+BIT5);//P3DS |=(BIT4+BIT5);//停止UART,并选择SMCLK作为UART时钟源UCA0CTL1 = UCSSEL__SMCLK+UCSWRST;//启用红外功能UCA0IRCTL = UCIREN;//UCA0MCTL=UCOS16;//配置速率UCA0BR0= 0X15;// 16000000/57600bps=277.777 取整为277=0x0115UCA0BR1= 0x01;//重启UARTUCA0CTL1 &= ~UCSWRST;// 失能软件复位标志,初始化完成UCA0IE|=UCRXIE;// 启用接收中断
}

//IrDaSend("hello world!\n",sizeof("hello world!\n"));
//发送
static void IrDaSend(u8* string,i32 len)
{i32 idx;for(idx=0;idx<len;idx++){while (!(UCA0IFG & UCTXIFG));UCA0TXBUF = string[idx];}
}

//接收
//UART中断
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{u8 ch;switch(__even_in_range(UCA0IV,4)){case 0:// 无中断Vector 0 – no interruptbreak;case 2:// 接收中断 Vector 2 – RXIFGch = UCA0RXBUF;//发送单字节数据 TX -> RXed characterwhile (!(UCA0IFG & UCTXIFG));// 等待发送缓冲准备 USCI_A0 TX buffer ready?UCA0TXBUF=ch;break;case 4:// 发送中断 Vector 4 – TXIFGbreak;default: break;}
}

,

Susan Yang:

谢谢您的分享!

赞(0)
未经允许不得转载:TI中文支持网 » 求一个msp430f5438A的irda demo code
分享到: 更多 (0)