中级
30 分钟

使用 MAX399 和 ${MCU} 彻底改变数据采集和远程监控应用

一个 UART,四个 RS-232 朋友:CMOS MUX 奇迹!

UART MUX 2 Click with Arduino UNO Rev3

已发布 6月 26, 2024

点击板

UART MUX 2 Click

开发板

Arduino UNO Rev3

编译器

NECTO Studio

微控制器单元

ATmega328P

通过实施我们的CMOS模拟多路复用器来优化您的UART接口并简化串行数据通信,该多路复用器允许四个远程RS-232收发器高效共享单个UART连接。

A

A

硬件概览

它是如何工作的?

UART MUX 2 Click基于MAX399,这是一款精确的CMOS模拟多路复用器,可实现来自Analog Devices的伪多路RS232传输。此多路复用器允许多个通道(在本例中为四个)共享单个UART接口。它提供快速的切换速度,转换时间小于250ns,导通电阻小于100Ω,同时保持CMOS逻辑输入兼容性和快速切换。双四对一多路复用器允许MAX3221收发器与连接到Click板™上部标记为UART0-UART3的四个远程收发器形成网络。电路的电源电压范围(3V至5.5V)使其兼容3V和5V逻辑。MAX399直接从MAX3221的电源端子接收电源,其±5.5V输出来自内部电荷泵。多路复用器处

理轨到轨信号,因此从MAX3221获取电源可确保RS232信号无论幅度如何都能直接通过。UART MUX Click通过MAX3221使用UART接口与MCU通信进行数据传输。MAX3221可以以高达250 kbps的数据速率运行,同时保持符合RS232的输出电平。通道选择通过一组特定的GPIO引脚执行,这些引脚标记为A0和A1,分别路由到mikroBUS™插座的CS和RST引脚。例如,选择通道1使得MAX3221可以与UART0通信,而不被UART1至UART3加载。远程收发器内的下拉电阻将未选择的接收器输出强制到已知状态。除了通道选择之外,该Click板™还具有自动关机功

能,当ON和OFF引脚为高电平时可以关闭,该引脚路由到mikroBUS™插座的PWM和AN引脚。此外,它使用mikroBUS™的中断引脚标记为INV作为无效指示器,使与RS232的接口变得简单易用,指示是否存在有效的RS232信号。此Click板™可以通过VCC SEL跳线选择在3.3V或5V逻辑电压水平下工作。这样,具有3.3V和5V能力的MCU都可以正确使用通信线路。此外,该Click板™配有包含易于使用的函数和示例代码的库,可作为进一步开发的参考。

UART MUX 2 Click top side image
UART MUX 2 Click bottom side image

功能概述

开发板

Arduino UNO 是围绕 ATmega328P 芯片构建的多功能微控制器板。它为各种项目提供了广泛的连接选项,具有 14 个数字输入/输出引脚,其中六个支持 PWM 输出,以及六个模拟输入。其核心组件包括一个 16MHz 的陶瓷谐振器、一个 USB 连接器、一个电

源插孔、一个 ICSP 头和一个复位按钮,提供了为板 子供电和编程所需的一切。UNO 可以通过 USB 连接到计算机,也可以通过 AC-to-DC 适配器或电池供电。作为第一个 USB Arduino 板,它成为 Arduino 平台的基准,"Uno" 符号化其作为系列首款产品的地

位。这个名称选择,意为意大利语中的 "一",是为了 纪念 Arduino Software(IDE)1.0 的推出。最初与 Arduino Software(IDE)版本1.0 同时推出,Uno 自此成为后续 Arduino 发布的基础模型,体现了该平台的演进。

Arduino UNO Rev3 double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

AVR

MCU 内存 (KB)

32

硅供应商

Microchip

引脚数

28

RAM (字节)

2048

你完善了我!

配件

Arduino Mega 的 Click Shield 配备了四个 mikroBUS™ 插槽,其中两个是 Shuttle 连接器,允许所有的 Click board™ 设备与 Arduino Mega 板轻松连接。Arduino Mega 板采用了AVR 8位微控制器,具有先进的RISC架构,54个数字 I/O 引脚,并且兼容 Arduino™,为原型设计和创建多样化应用提供了无限的可能性。该板通过 USB 连接方便地进行控制和供电,以便在开箱即用时高效地对 Arduino Mega 板进行编程和调试,另外还需要将额外的 USB 电缆连接到板上的 USB B 端口。通过集成的 ATmega16U2 程序器简化项目开发,并利用丰富的 I/O 选项和扩展功能释放创造力。有八个开关,您可以将其用作输入,并有八个 LED,可用作 MEGA2560 的输出。此外,该 shield 还具有来自 Microchip 的高精度缓冲电压参考 MCP1501。该参考电压默认通过板底部的 EXT REF 跳线选择。您可以像通常在 Arduino Mega 板上那样选择外部参考电压。还有一个用于测试目的的 GND 钩子。另外,还有四个额外的 LED,分别是 PWR、LED(标准引脚 D13)、RX 和 TX LED,连接到 UART1(mikroBUS™ 1 插槽)。此 Click Shield 还具有几个开关,执行诸如选择 mikroBUS™ 插槽上模拟信号的逻辑电平以及选择 mikroBUS™ 插槽本身的逻辑电压级别等功能。此外,用户还可以使用现有的双向电平转换器,无论 Click board™ 是否以3.3V或5V逻辑电压级别运行,都可以使用任何 Click board™。一旦您将 Arduino Mega 板与 Click Shield for Arduino Mega 连接,就可以访问数百个使用3.3V或5V逻辑电压级别工作的 Click board™。

Click Shield for Arduino UNO accessories 1 image

使用的MCU引脚

mikroBUS™映射器

Force OFF
PC0
AN
UART Channel Selection
PD2
RST
UART Channel Selection
PB2
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Force ON
PD6
PWM
Valid RS232 Signal Indication
PC3
INT
UART TX
PD0
TX
UART RX
PD1
RX
NC
NC
SCL
NC
NC
SDA
Power Supply
5V
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

UART MUX 2 Click Schematic schematic

一步一步来

项目组装

Click Shield for Arduino UNO front image hardware assembly

从选择您的开发板和Click板™开始。以Arduino UNO Rev3作为您的开发板开始。

Click Shield for Arduino UNO front image hardware assembly
Arduino UNO Rev3 front image hardware assembly
Charger 27 Click front image hardware assembly
Prog-cut hardware assembly
Charger 27 Click complete accessories setup image hardware assembly
Arduino UNO Rev3 Access MB 1 - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
Arduino UNO MCU Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

实时跟踪您的结果

应用程序输出

此款Click板可通过两种方式进行接口连接和监控:

  • Application Output - 在调试模式下,使用“Application Output”窗口进行实时数据监控。按照本教程正确设置它。

软件支持

库描述

该库包含 UART MUX 2 Click 驱动程序的 API。

关键功能:

  • uartmux2_set_operation_mode - UART MUX 2 设置操作模式函数

  • uartmux2_set_channel - UART MUX 2 设置通道函数

  • uartmux2_send_data - UART MUX 2 数据写入函数

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * @file main.c
 * @brief UART MUX 2 Click Example.
 *
 * # Description
 * This library contains API for UART MUX 2 Click driver.
 * This example transmits/receives and processes data from UART MUX 2 clicks.
 * The library initializes and defines the UART bus drivers 
 * to transmit or receive data. 
 *
 * The demo application is composed of two sections :
 *
 * ## Application Init
 * Initializes driver and set UART channel module.
 *
 * ## Application Task
 * Transmitter/Receiver task depend on uncommented code.
 * Receiver logging each received byte to the UART for data logging,
 * while transmitted send messages every 2 seconds.
 *
 * ## Additional Function
 * - static void uartmux2_clear_app_buf ( void ) - Function clears memory of app_buf.
 * - static err_t uartmux2_process ( void ) - The general process of collecting presponce
 * that a module sends.
 *
 * @author Nenad Filipovic
 *
 */

#include "board.h"
#include "log.h"
#include "uartmux2.h"

#define PROCESS_BUFFER_SIZE 200

#define TRANSMITTER
// #define RECIEVER

static uartmux2_t uartmux2;
static log_t logger;
static uint8_t uart_ch;
static char app_buf[ PROCESS_BUFFER_SIZE ] = { 0 };
static int32_t app_buf_len = 0;
static int32_t app_buf_cnt = 0;

unsigned char demo_message[ 9 ] = { 'M', 'i', 'k', 'r', 'o', 'E', 13, 10, 0 };

/**
 * @brief UART MUX 2 clearing application buffer.
 * @details This function clears memory of application buffer and reset it's length and counter.
 * @note None.
 */
static void uartmux2_clear_app_buf ( void );

/**
 * @brief UART MUX 2 data reading function.
 * @details This function reads data from device and concats data to application buffer.
 *
 * @return @li @c  0 - Read some data.
 *         @li @c -1 - Nothing is read.
 *         @li @c -2 - Application buffer overflow.
 *
 * See #err_t definition for detailed explanation.
 * @note None.
 */
static err_t uartmux2_process ( void );

void application_init ( void ) {
    log_cfg_t log_cfg;  /**< Logger config object. */
    uartmux2_cfg_t uartmux2_cfg;  /**< Click config object. */

    /** 
     * Logger initialization.
     * Default baud rate: 115200
     * Default log level: LOG_LEVEL_DEBUG
     * @note If USB_UART_RX and USB_UART_TX 
     * are defined as HAL_PIN_NC, you will 
     * need to define them manually for log to work. 
     * See @b LOG_MAP_USB_UART macro definition for detailed explanation.
     */
    LOG_MAP_USB_UART( log_cfg );
    log_init( &logger, &log_cfg );
    log_printf( &logger, "\r\n Application Init \r\n" );

    // Click initialization.

    uartmux2_cfg_setup( &uartmux2_cfg );
    UARTMUX2_MAP_MIKROBUS( uartmux2_cfg, MIKROBUS_1 );
    err_t init_flag  = uartmux2_init( &uartmux2, &uartmux2_cfg );
    if ( init_flag == UART_ERROR ) {
        log_error( &logger, " Application Init Error. " );
        log_info( &logger, " Please, run program again... " );

        for ( ; ; );
    }

    uartmux2_default_cfg ( &uartmux2 );
    app_buf_len = 0;
    app_buf_cnt = 0;
    log_printf( &logger, "\r\n Application Task \r\n" );
    log_printf( &logger, "------------------\r\n" );
    Delay_ms( 500 );
    
    #ifdef TRANSMITTER
    
        log_printf( &logger, "    Send data:    \r\n" );
        log_printf( &logger, "      mikroE      \r\n" );
        log_printf( &logger, "------------------\r\n" );
        log_printf( &logger, "  Transmit data   \r\n" );
        Delay_ms( 1000 );

    #endif

    #ifdef RECIEVER

        uart_ch = UARTMUX2_CHANNEL_0;
        log_printf( &logger, "   Receive data  \r\n" );
        log_printf( &logger, "      UART%u \r\n", ( uint16_t ) uart_ch );
        uartmux2_set_channel( &uartmux2, uart_ch );
        Delay_ms( 2000 );
    
    #endif
        
    log_printf( &logger, "------------------\r\n" );
}

void application_task ( void ) {
    #ifdef TRANSMITTER
    
    for ( uart_ch = UARTMUX2_CHANNEL_0; uart_ch <= UARTMUX2_CHANNEL_3; uart_ch++ ) {
        uartmux2_set_channel( &uartmux2, uart_ch );
        Delay_ms( 100 );
        uartmux2_send_data( &uartmux2, demo_message );
        log_printf( &logger, "  UART%u : ", ( uint16_t ) uart_ch ); 
    
        for ( uint8_t cnt = 0; cnt < 9; cnt ++ ) {
            log_printf( &logger, "%c", demo_message[ cnt ] );
            Delay_ms( 100 );
        }     
    }
    
    log_printf( &logger, "------------------\r\n" );
    Delay_ms( 100 );
    
    
    #endif
    
    #ifdef RECIEVER
    
    uartmux2_process( );

    if ( app_buf_len > 0 ) {
        log_printf( &logger, "%s", app_buf );
        uartmux2_clear_app_buf(  );
    }
    
    #endif
}

void main ( void ) {
    application_init( );

    for ( ; ; ) {
        application_task( );
    }
}

static void uartmux2_clear_app_buf ( void ) {
    memset( app_buf, 0, app_buf_len );
    app_buf_len = 0;
    app_buf_cnt = 0;
}

static err_t uartmux2_process ( void ) {
    int32_t rx_size;
    char rx_buff[ PROCESS_BUFFER_SIZE ] = { 0 };

    rx_size = uartmux2_generic_read( &uartmux2, rx_buff, PROCESS_BUFFER_SIZE );

    if ( rx_size > 0 ) {
        int32_t buf_cnt = 0;

        if ( app_buf_len + rx_size >= PROCESS_BUFFER_SIZE ) {
            uartmux2_clear_app_buf(  );
            return -2;
        } else {
            buf_cnt = app_buf_len;
            app_buf_len += rx_size;
        }

        for ( int32_t rx_cnt = 0; rx_cnt < rx_size; rx_cnt++ ) {
            if ( rx_buff[ rx_cnt ] != 0 ) {
                app_buf[ ( buf_cnt + rx_cnt ) ] = rx_buff[ rx_cnt ];
            } else {
                app_buf_len--;
            }

        }
        return 0;
    }
    return -1;
}

// ------------------------------------------------------------------------ END

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。