查看: 27342
回复: 33
基于stm8L单片机的IrDA红外数据通讯实验
立创快报
【官方工作人员】
8
主题
1
回复
发表于2017-05-17 10:39:42 | 显示全部楼层
1# 电梯直达

基于stm8L单片机的IrDA红外数据通讯实验

 作者 立创赵工 

1、作品简介

       最近发现立创商城上有个IrDA收发器出现!玩够了常见的WIFI、蓝牙、GPRS2.4G nRF24L01电子器件和模块,笔者对IrDA还是没用过,决定尝尝鲜咯!因此,做了下面这个IrDA红外数据通讯实验。

    实验板外形图:

 

    PS: 这个实验板,因为电路较简单,笔者采用的是立创商城上,下单即可免费拿的“STM8L051+LT8920+ME6209的评估板模块(PCB空板)”进行改装的,该板的商品编号是:C94731 

    什么是IrDA? 顺此,先给大家简单介绍一下:

IrDA是红外数据组织(Infrared Data Association)的简称,目前广泛采用的IrDA红外连接技术就是由该组织提出的.到目前为止,全球采用IrDA技术的设备超过了5000万部。 IrDA已经制订出物理介质和协议层规格,以及2个支持IrDA标准的设备可以相互监测对方并交换数据。 初始的IrDA1.0标准制订了一个串行,半双工的同步系统,传输速率为2400bps115200bps,传输范围1 m,传输半角度为15度到30度。最近IrDA扩展了其物理层规格使数据传输率提升到4Mbps

    IrDA数据协议由物理层,链路接入层和链路管理层三个基本层协议组成,另外,为满足各层上的应用的需要,IrDA栈支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM,IrOBEXIrLAN等。

    需要特别指出的是:本实验只是IrDA物理层的通讯实验。

2、作品亮点


    ① 所选用的IrDA收发器TFBS4711是一个小体积的红外收发模组,尺寸6x3x1.9mm

    ② 符合IrPHY1.2 标准,IrFM快速链接需求。

    ③ 通信速率:115.2kbs (SIR),支持双向、全半工的通讯链接。

    ④ 可实现的直线通讯距离:~1米。

    ⑤ 使用内置支持IrDA底层信号编码和解码的低功耗单片机STM8L051F3P6做主控。

    ⑥ IrDA模组耗电量极小,关断电流只有大概10nA

    ⑦ 采用最常用的MicroUSB插座作为电源输入接口。

     本实验所用的IrDA通信具有功耗低、链接时间短、通信安全、无电磁干扰等优点!

3、硬件原理图描述

    首先,我们先来这个实验电路的构架图:

    其中,单片机驱动部分的原理图,可为多个部分,下面逐个介绍:

    第一部分: 单片机主控部分

    备注说明: 上图采用ST公司的低功耗单片机STM8L051F3P6进行设计,该单片机的PC5PC6分别链接到IrDA收发器TFBS4711TXRX端口,而单片机的PB4用来控制TFBS4711的电源使能端,当PB4=0的时候,IrDA收发器才可正常工作,反之PB4=1,那么IrDA收发器关断,此时的耗电量极少噢!D1D2是工作状态指示灯,分别连接到PC0PC1

    第二部分:单片机外围部分

    备注说明: 如上图所示,P2SWIM接口,单片机STM8L051F3P6的程序,可通过ST-LINK/V2 开发工具对该芯片下载或仿真。而S1~S4是轻触按键,本实验电路,只焊接安装了S4按键,因为其它按键用不到。

    第三部分:系统的供电电源部分

    备注说明: 如上图所示,F1是可恢复保险丝(0.2A), U33.3VLDOD3是电源指示灯。

第四部分:IrDA模组TFBS4711的相关简介

TFBS4711是一个小体积的红外收发模组,它支持半双工的IrDA红外通信,传输速率可达115 .2kbit/s(SIR). 模组内部包含了一个PIN类型的光电二极管、一个红外发射管(IRED)和一个低功耗的CMOS控制芯片。它是为低功耗的IRDA标准而设计,直线通信高达至1。支持低功耗模式,当SD引脚有效的时候,这个模组的电流消化才10nA左右。相比一般的无线电传输(蓝牙、WIFI2.4G nRF24系列等等),红外传输具有无电磁干扰、通信距离短但安全性高、使用简单的特点,比如STM8或者STM32一般都集成了IrDA的硬件支持单元,结合使用TFBS4711即可快速建立起一个基于光技术的“无线”数据通信系统。

 4、材料清单(BOM列表)

    以下是这个电子制作的BOM列表,器件全部采购来自立创商城http://www.szlcsc.com,PCB板的制造在深圳嘉立创完成。

5、软件部分的描述

    本实验的主控单片机stm8L051F3P6 使用IAR公司的编译器进行软件开发,结合ST官方网站可下载的stm8L函数驱动库,进行coding。软件实现的主要功能是,按键S4触发后,两块同样配置和固件的PCBA板之间进行数据信息的交换,驱动LED等等。如下是实验代码的关键片段:


     6-1、单片机stm8L051F3P6IrDA 初始化片段

      6-2、主控程序片段


PS 该实验的完整软件、工程源码在这里,点击下载:TFBS4711的IrDA测试工程源码.rar 



6、现场试验&视频

    具体的实验视频链接如下:

      http://v.youku.com/v_show/id_XMjc2NzUxNDQwMA==.html


       

      

    

7、总结

      通过以上相关实验介绍,特别是视频方面的功能演示,相信大家对IrDA有了一定的了解。相比一般的无线电传输(蓝牙、WIFI、2.4G nRF24系列等等),红外传输具有无电磁干扰、通信距离短但安全性高、使用简单的特点,STM8或者STM32一般都集成了IrDA的硬件支持单元,操作IrDA就像操作串口一样简单!结合使用IrDA器件TFBS4711即可快速建立起一个基于光技术的“无线”数据通信系统。后续,我们将通过光纤的引入,进一步来介绍TFBS4711的高级应用,比如可隔离数万伏高电压的远距离数据通信或完整的IrDA协议栈功能应用等等。。。

此账号用于发布《立创快报》最新资讯及相关趣味文章,欢迎大家多多关注!!!
WENTONG
0
主题
3
回复
发表于2018-05-28 10:11:22   |  显示全部楼层
17#

如何设置红外模式。stm32f103 MUC还是不行。请指教。

#include "stm32f10x.h"   
#include "delay.h"   
   
/** @addtogroup StdPeriph_Examples  
  * @{  
  */   
   
/** @addtogroup USART_IrDA_Receive  
  * @{  
  */    
   
/* Private typedef -----------------------------------------------------------*/   
/* Private define ------------------------------------------------------------*/   
#define  NOKEY  0x00   
#define  SEL    0x01   
#define  RIGHT  0x02   
#define  LEFT   0x03   
#define  UP     0x04   
#define  DOWN   0x05   
   
/* Private macro -------------------------------------------------------------*/   
/* Private variables ---------------------------------------------------------*/   
USART_InitTypeDef USART_InitStructure;   
uint8_t ReceivedData = 0;   
   
/* Private function prototypes -----------------------------------------------*/   
void RCC_Configuration(void);   
void GPIO_Configuration(void);   
   
/* Private functions ---------------------------------------------------------*/   
   
/**  
  * @brief  Main program  
  * @param  None  
  * @retval : None  
  */   
int main(void)   
{   
  /* System Clocks Configuration */   
  RCC_Configuration();   
   
  /* Configure the GPIO ports */   
  GPIO_Configuration();   
   
/* USART3 configuration ------------------------------------------------------*/   
  /* USART3 configured as follow:  
        - BaudRate = 115200 baud    
        - Word Length = 8 Bits  
        - One Stop Bit  
        - No parity  
        - Hardware flow control disabled (RTS and CTS signals)  
        - Receive and transmit enabled  
  */   
  USART_InitStructure.USART_BaudRate = 9600;   
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   
  USART_InitStructure.USART_Parity = USART_Parity_No ;   
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
     
  /* Configure the USART3 */   
  USART_Init(USART2, &USART_InitStructure);   
  /* Enable the USART3 */   
  USART_Cmd(USART2, ENABLE);   
   
  /* Set the USART3 prescaler */   
  USART_SetPrescaler(USART2, 0x1);   
  /* Configure the USART3 IrDA mode */   
  USART_IrDAConfig(USART2, USART_IrDAMode_Normal);   
   
  /* Enable the USART3 IrDA mode */   
  USART_IrDACmd(USART2, ENABLE);  
  
  
  
  
  USART_InitStructure.USART_BaudRate = 9600;   
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   
  USART_InitStructure.USART_Parity = USART_Parity_No ;   
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
     
  /* Configure the USART3 */   
  USART_Init(USART1, &USART_InitStructure);   
  /* Enable the USART3 */   
  USART_Cmd(USART1, ENABLE);   
   
  /* Set the USART3 prescaler */   
  USART_SetPrescaler(USART1, 0x1);   
  /* Configure the USART3 IrDA mode */   
  USART_IrDAConfig(USART1, USART_IrDAMode_Normal);   
   
  /* Enable the USART3 IrDA mode */   
  USART_IrDACmd(USART1, ENABLE);  
   
  while (1)   
  {   
    
    USART_SendData(USART1,1);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)   
    {   
    }
    delay_ms(1000);
    
    /* Wait until a byte is received */   
    while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)   
    {   
    }   
    /* Read the received byte */   
    ReceivedData = USART_ReceiveData(USART2);   
   
    switch(ReceivedData)   
    {   
      case UP:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_6);        
        break;   
      case DOWN:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_7);   
        break;   
      case LEFT:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_8);   
        break;   
      case RIGHT:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_9);   
        break;   
      case SEL:   
        GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);  
        break;   
      case NOKEY:   
        break;   
      default:   
        break;   
    }   
  }   
}   
   
/**  
  * @brief  Configures the different system clocks.  
  * @param  None  
  * @retval : None  
  */   
void RCC_Configuration(void)   
{   
  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,    
     initialize the PLL and update the SystemFrequency variable. */   
  SystemInit();   
       
  /* Enable GPIOC, GPIO_LED and AFIO clocks */   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    
  /* Enable USART3 clocks */   
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}   
   
/**  
  * @brief  Configures the different GPIO ports.  
  * @param  None  
  * @retval : None  
  */   
void GPIO_Configuration(void)   
{   
  GPIO_InitTypeDef GPIO_InitStructure;   
   
  /* Configure USART1 Tx (PA.9)as alternate function push-pull */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
     
  /* Configure USART1 Rx PA.10 as input floating */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
  
  /* Configure USART2 Tx (PA.2)as alternate function push-pull */  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
     
  /* Configure USART2 Rx PA.3 as input floating */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
    
}   
   
#ifdef  USE_FULL_ASSERT   
   
/**  
  * @brief  Reports the name of the source file and the source line number  
  *   where the assert_param error has occurred.  
  * @param file: pointer to the source file name  
  * @param line: assert_param error line source number  
  * @retval : None  
  */   
void assert_failed(uint8_t* file, uint32_t line)   
{    
  /* User can add his own implementation to report the file name and line number,  
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */   
   
  /* Infinite loop */   
  while (1)   
  {   
  }   
}   
#endif   
   
/**  
  * @}  
  */    
   
/**  
  * @}  
  */    
   
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FI****


WENTONG
0
主题
3
回复
发表于2018-05-28 10:25:00   |  显示全部楼层
18#

 使用两种模式:

  普通的RS232:一个TFBS4711TX接RS232的TX,另外一个TFBS4711的RX监控

 一个TFBS4711TX接仿真器CHANNEL 0另外一个TFBS4711的RX仿真器CHANNEL 1

通过RS232直接发‘AA’实验图片如下

NUCLEO-F103RB MCU:

USART1 Tx (PA.9)USART1 Rx PA.10USART2 Tx (PA.2)USART2 Rx PA.3

下载上面程序,通过仿真器现象一样,说明红外模式设置没有成功。

点击查看大图

WENTONG
0
主题
3
回复
发表于2018-05-28 12:09:45   |  显示全部楼层
20#

 

1.上图是我们的待测试板,TXD 接到NUCLEO-F103RB MCU板上USART2 Tx (PA.2),RXD接到 NUCLEO-F103RB MCU板上USART2 Rx PA.3------板子VCC为3.3V。

2.还有一个单独U2我们接到一块小板子上,IRED_A上拉12OHM电阻到3V3 ,SD直接拉GND,TXD 接到NUCLEO-F103RB MCU板上USART2 Tx (PA.9),RXD接到 NUCLEO-F103RB MCU板上USART2 Rx PA.10上。


主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部