中级
30 分钟

使用 TCA9545A 和 PIC18F45K42 简化和提升您的 I2C 管理需求

切换,复用及更多

I2C MUX 2 Click with EasyPIC v8

已发布 6月 24, 2024

点击板

I2C MUX 2 Click

开发板

EasyPIC v8

编译器

NECTO Studio

微控制器单元

PIC18F45K42

致力于提升您的I2C通信能力,我们的使命是提供无缝访问I2C多路复用的功能,提供用户友好且灵活的解决方案,以有效应对复杂的I2C场景。

A

A

硬件概览

它是如何工作的?

I2C MUX 2 Click 基于德州仪器的TCA9545A,这是一款4通道、双向转换I2C开关。主SCL/SDA信号对被引导到四个从设备通道,SC0/SD0至SC3/SD3。可以选择任意一个下游通道,也可以选择四个通道的任意组合。TCA9545A还支持中断信号,以便主设备检测连接到INT3-INT0输入端子的任何从设备产生的中断,该中断信号会传送到INT输出端子。该设备提供一个低电平有效的RESET输入,用于重置状态机,并在下游I2C总线之一卡在低电平时允许TCA9545A恢复。设备的状态机还可以通过循环电源VCC(即上电复位,POR)重置。RESET功能和POR都会导致所有通道被取消选择。I2C数据路径的连接由相同的I2C主设备控制,该主设备切换与多个I2C从设备通信。通过焊接标记为ADDR SEL的SMD跳线来配置I2C从设备地址,以设置最低有效位(LSB)。在成功确认从设备地址后,可以读写一个8位控制寄存器,以确定选定的通道和中断的状

态。TCA9545A还可以用于电压转换,允许在每个SCn/SDn对上使用不同的总线电压,使1.8V、2.5V或3.3V部件能够与5V部件通信。这通过使用外部上拉电阻将总线拉到主设备和每个从设备通道所需的电压来实现。一个或多个SCn/SDn下游对或通道通过控制寄存器的内容进行选择。TCA9545A被寻址后,控制寄存器被写入。控制字节的四个LSB用于确定要选择的通道。当一个通道被选中时,在I2C总线上发出停止条件后它会变为活动状态。这确保了所有SCn/SDn线在通道激活时处于高电平状态,以便在连接时不会产生错误条件。确认周期后必须始终发生停止条件。TCA9545A提供四个中断输入(每个通道一个)和一个开漏中断输出。当任何设备产生中断时,TCA9545A会检测到该中断并将中断输出驱动为低电平。通道不需要处于活动状态即可检测中断。控制寄存器中的位也会被设置。控制寄存器的第4-7位分别对应于TCA9545A的0-3通道。因此,如

果连接到通道1的任何设备产生中断,当读取操作完成时,中断输入的状态将被加载到控制寄存器中。同样,连接到通道0的任何设备产生中断,将导致读取时控制寄存器的第4位被设置。主设备随后可以寻址TCA9545A并读取控制寄存器的内容,以确定哪个通道包含产生中断的设备。然后主设备可以重新配置TCA9545A以选择该通道并定位产生中断的设备并清除它。应注意,一个通道上可能有多个设备提供中断,因此主设备必须确保通道上的所有设备都被询问中断。如果不需要中断功能,中断输入可以用作通用输入。如果未使用,中断输入必须连接到VCC。此Click板™可以通过VCC SEL跳线选择3.3V或5V逻辑电压水平。这种方式,3.3V和5V的MCU都可以正确使用通信线路。此外,该Click板™配有一个库,包含易于使用的函数和示例代码,可以用作进一步开发的参考。

I2C MUX 2 Click top side image
I2C MUX 2 Click bottom side image

功能概述

开发板

EasyPIC v8 是一款专为快速开发嵌入式应用的需求而特别设计的开发板。它支持许多高引脚计数的8位PIC微控制器,来自Microchip,无论它们的引脚数量如何,并且具有一系列独特功能,例如首次集成的调试器/程序员。开发板布局合理,设计周到,使得最终用户可以在一个地方找到所有必要的元素,如开关、按钮、指示灯、连接器等。得益于创新的制造技术,EasyPIC v8 提供了流畅而沉浸式的工作体验,允许在任何情况下、任何地方、任何时候都能访问。

EasyPIC v8 开发板的每个部分都包含了使同一板块运行最高效的必要组件。除了先进的集成CODEGRIP程 序/调试模块,该模块提供许多有价值的编程/调试选项和与Mikroe软件环境的无缝集成外,该板还包括一个干净且调节过的开发板电源供应模块。它可以使用广泛的外部电源,包括电池、外部12V电源供应和通过USB Type-C(USB-C)连接器的电源。通信选项如USB-UART、USB DEVICE和CAN也包括在内,包括 广受好评的mikroBUS™标准、两种显示选项(图形和

基于字符的LCD)和几种不同的DIP插座。这些插座覆盖了从最小的只有八个至四十个引脚的8位PIC MCU的广泛范围。EasyPIC v8 是Mikroe快速开发生态系统的一个组成部分。它由Mikroe软件工具原生支持,得益于大量不同的Click板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作和开发的许多方面。

EasyPIC v8 horizontal image

微控制器概述 

MCU卡片 / MCU

PIC18F45K42

建筑

PIC

MCU 内存 (KB)

32

硅供应商

Microchip

引脚数

40

RAM (字节)

2048

使用的MCU引脚

mikroBUS™映射器

NC
NC
AN
Reset
RE1
RST
NC
NC
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
NC
NC
PWM
Interrupt
RB0
INT
NC
NC
TX
NC
NC
RX
I2C Clock
RC3
SCL
I2C Data
RC4
SDA
Power Supply
5V
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

I2C MUX 2 Click Schematic schematic

一步一步来

项目组装

EasyPIC v8 front image hardware assembly

从选择您的开发板和Click板™开始。以EasyPIC v8作为您的开发板开始。

EasyPIC v8 front image hardware assembly
GNSS2 Click front image hardware assembly
MCU DIP 40 hardware assembly
GNSS2 Click complete accessories setup image hardware assembly
EasyPIC v8 Access DIPMB 1 - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
NECTO Compiler Selection Step Image hardware assembly
NECTO Output Selection Step Image hardware assembly
Necto image step 6 hardware assembly
Necto DIP image step 7 hardware assembly
Necto image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Necto PreFlash Image hardware assembly

软件支持

库描述

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

关键功能:

  • i2cmux2_hw_reset - 此函数通过将RST引脚清除100毫秒来复位I2C MUX 2 Click板

  • i2cmux2_set_channel - 此函数设置I2C MUX 2 Click板的通道

  • i2cmux2_generic_read - 此函数从指定寄存器读取数据

开源

代码示例

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

/*!
 * \file 
 * \brief I2cMux2 Click example
 * 
 * # Description
 * This example demonstrates the use of the I2C MUX 2 Click board.
 *
 * The demo application is composed of two sections :
 * 
 * ## Application Init 
 * Initializes the driver, performs the device reset, and makes an initial log.
 * 
 * ## Application Task  
 * In this example, we read the device ID register of the connected Click boards.
 * Channel 0 : 6DOF IMU 11 Click [slave address: 0x0E; reg: 0x00; id val.: 0x2D],
 * Channel 1 : Altitude Click    [slave address: 0x60; reg: 0x0C; id val.: 0xC4],
 * Channel 2 : 6DOF IMU 9 Click  [slave address: 0x69; reg: 0x75; id val.: 0xA9],
 * Channel 3 : Compass 3 Click   [slave address: 0x30; reg: 0x2F; id val.: 0x0C].
 * All data logs write on USB UART changes every 2 sec.
 * 
 * @note
 * Disable all unconnected channels from the example using ENABLE_CHANNEL_x macros
 * below to prevent the I2C bus from blocking waiting for a device response.
 * 
 * \author MikroE Team
 *
 */
// ------------------------------------------------------------------- INCLUDES

#include "board.h"
#include "log.h"
#include "i2cmux2.h"

// ------------------------------------------------------------------ VARIABLES

// Comment out the following lines to exclude unconnected channels from the example
#define ENABLE_CHANNEL_0
#define ENABLE_CHANNEL_1
#define ENABLE_CHANNEL_2
#define ENABLE_CHANNEL_3

static i2cmux2_t i2cmux2;
static log_t logger;
static uint8_t rx_data;

// ------------------------------------------------------- ADDITIONAL FUNCTIONS

void display_log ( uint8_t sel_ch )
{
    switch ( sel_ch )
    {
        case I2CMUX2_CMD_SET_CH_0:
        {
            log_printf( &logger, "   0  |  " );
            break;
        }
        case I2CMUX2_CMD_SET_CH_1:
        {
            log_printf( &logger, "   1  |  " );
            break;
        }
        case I2CMUX2_CMD_SET_CH_2:
        {
            log_printf( &logger, "   2  |  " );
            break;
        }
        case I2CMUX2_CMD_SET_CH_3:
        {
            log_printf( &logger, "   3  |  " );
            break;
        }
        default:
            break;
    }
    log_printf( &logger, "0x%.2X", ( uint16_t ) rx_data );
    
    if ( i2cmux2_check_int( &i2cmux2 ) == I2CMUX2_INT_PIN_STATE_ACTIVE )
    {
        if ( i2cmux2_read_interrupt( &i2cmux2 ) & sel_ch  )
        {
            log_printf( &logger, "  |  ON \r\n" );
        }
        else
        {
            log_printf( &logger, "  | OFF \r\n" );
        }
    }
    else
    {
        log_printf( &logger, "  | OFF \r\n" );
    }
}

// ------------------------------------------------------ APPLICATION FUNCTIONS

void application_init ( void )
{
    log_cfg_t log_cfg;
    i2cmux2_cfg_t cfg;

    /** 
     * 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_info( &logger, "---- Application Init ----" );

    //  Click initialization.
    i2cmux2_cfg_setup( &cfg );
    I2CMUX2_MAP_MIKROBUS( cfg, MIKROBUS_1 );
    i2cmux2_init( &i2cmux2, &cfg );

    Delay_ms ( 100 );
    log_printf( &logger, "I2C MUX 2 Click driver init\r\n");
    log_printf( &logger, "---------------------------------------\r\n");
    Delay_ms ( 100 );

    i2cmux2_hw_reset( &i2cmux2 );
    log_printf( &logger, "I2C MUX 2 Click HW reset\r\n");
    log_printf( &logger, "---------------------------------------\r\n");
    Delay_ms ( 100 );
}

void application_task ( void )
{
    log_printf( &logger, "  CH  |   ID   |  INT \r\n" );
    log_printf( &logger, "----------------------\r\n" );
    
#ifdef ENABLE_CHANNEL_0
    // SET CHANNEL 0: 6DOF IMU 11 Click
    i2cmux2_set_channel( &i2cmux2, I2CMUX2_CMD_SET_CH_0, 0x0E );
    Delay_ms ( 100 );
    i2cmux2_generic_read( &i2cmux2, 0x00, &rx_data, 1 );
    display_log( I2CMUX2_CMD_SET_CH_0 );
#endif
    
#ifdef ENABLE_CHANNEL_1
    // SET CHANNEL 1: Altitude Click
    i2cmux2_set_channel( &i2cmux2, I2CMUX2_CMD_SET_CH_1, 0x60 );
    Delay_ms ( 100 );
    i2cmux2_generic_read( &i2cmux2, 0x0C, &rx_data, 1 );
    display_log( I2CMUX2_CMD_SET_CH_1 );
#endif
    
#ifdef ENABLE_CHANNEL_2
    // SET CHANNEL 2: 6DOF IMU 9 Click
    i2cmux2_set_channel( &i2cmux2, I2CMUX2_CMD_SET_CH_2, 0x69 );
    Delay_ms ( 100 );
    i2cmux2_generic_read( &i2cmux2, 0x75, &rx_data, 1 );
    display_log( I2CMUX2_CMD_SET_CH_2 );
#endif

#ifdef ENABLE_CHANNEL_3
    // SET CHANNEL 3: Compass 3 Click
    i2cmux2_set_channel( &i2cmux2, I2CMUX2_CMD_SET_CH_3, 0x30 );
    Delay_ms ( 100 );
    i2cmux2_generic_read( &i2cmux2, 0x2F, &rx_data, 1 );
    display_log( I2CMUX2_CMD_SET_CH_3 );
#endif

    log_printf( &logger, "----------------------\r\n" );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
}

int main ( void ) 
{
    /* Do not remove this line or clock might not be set correctly. */
    #ifdef PREINIT_SUPPORTED
    preinit();
    #endif
    
    application_init( );
    
    for ( ; ; ) 
    {
        application_task( );
    }

    return 0;
}


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

额外支持

资源

喜欢这个项目吗?

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