HaaS100I2Cで使用されるオンボードI2CMUXer

概要概要

この記事では、主にハードウェアの状況と、HaaS100I2CおよびI2CMUXerの使用方法を紹介します

 

適用範囲

  • HaaSおよびI2C周辺機器を知り、学びたい人
  • 開発にHaaSI2Cを使用したい開発者

 

目的

  • 完全なオンボードI2CMUXerの初期化、チャネル設定、およびI2Cに基づく読み取り

 

必要なツール

  • HaaS1001                ブロック
  •               1セットの電源が含まれています  
  • マイクロUSBライン          1
  • シリアル端子(ここではXshell 6(ビルド0206)を使用)                          

 

周辺機器の紹介

I²CInter-Integrated Circuit)は、マルチマスタースレーブアーキテクチャを使用するシリアル通信バスです。1980年代にフィリップスによって開発され、マザーボード、組み込みシステム、または携帯電話で低速の周辺機器を接続できるようになりました。I²Cの正しい発音は「ISquareC」です。

I²Cは2つの双方向オープンドレイン(シリアルデータ(SDA)とシリアルクロック(SCL))のみを使用し、抵抗を使用して電位を引き上げます。

I²Cリファレンスデザインは7ビットのアドレススペースを使用しますが、16個のアドレスを予約するため、バスのセットで最大112ノードと通信できます[a]。一般的なI²Cバスには、伝送速度に応じて異なるモードがあります。標準モード(100 kbit / s)、低速モード(10 kbit / s)ですが、クロック周波数をゼロまで下げることができます。つまり、通信を中断できます。 。新世代のI²Cバスは、より多くのノード(10ビットアドレススペースをサポート)とより高速で通信できます:高速モード(400 kbit / s)、高速+モード(1 Mbit / s)高速モード(3.4 Mbit / s)超高速モード(5 Mbit / s)。上記はウィキペディアから抜粋したものです

典型的なI2Cバス接続図(図1)を見てください。

image.png

図1一般的なI2Cバス接続

HaaS100I2Cの状況

HaaS100で使用されるHaaS1000メインコントロールチップは、2つのI2Cマスターをサポートします。そのうちの1つはUART2によって多重化され、ボード上の拡張インターフェイスに接続されます。図2のブラックボックスのピンを参照してください。これは、他のI2Cでは一時的に使用できません。リソースはお客様に提供されます。I2CMUXerを使用してI2Cの残りの1チャネルを4チャネルに拡張し、そのうち2つはオンチップで使用され、残りの2つは拡張インターフェイスに接続されています。図2の赤いボックスのピンを参照してください。

image.png

図2HaaS拡張スロット

 

HaaS100ボードでのI2C接続については、図3で強調表示されている部分を参照してください。これらはI2Cに関連する拡張機能です。

image.png

図3HaaS100I2C拡張の上面図

 

HaaS100ボードのI2Cロジックトポロジ図図4に示します。

image.png

図4HaaS100ボード上のI2Cロジックトポロジ図

 

I2C MUXer

TI(Texas Instruments)を使用したHaaS100はPCA9544A、4チャンネルマルチプレクサSMBusおよびI2Cです。詳細については、公式Webサイトを参照しください

ユーザーガイダンス

1.使用前の環境準備については、開発環境のインストールを参照してください。以下は、参考のために実際に操作するための環境です

  • この記事で使用されているシステムは次のとおりです。UBuntu16.04
  • aosキューブバージョン:0.5.10
  • Pythonバージョン:3.5.2

2.このプロセスに関連する関連ドキュメント:

I2CMUXerドライバー

  • コンポーネント/周辺機器/i2c_muxer/pca9544.c
  • コンポーネント/周辺機器/i2c_muxer/pca9544.h

処理する:

  • 関連マクロ、構造紹介
  1. /* ===== Default Configuration Based on BSP ===== */ 
    #ifdef HAAS_I2C
    #define I2C_PORT        1
    #define I2C_ADDR_W_8BIT 8
    #define I2C_BR_100K     100000
    #endif
    
    /* ===== MACRO Definition ===== */
    #define PCA9544_CHAN_CLEAN      0
    #define PCA9544_CONFIG_REG_LEN  1U
    #define PCA9544_IRQ_MASK        0xF0
    #define PCA9544_BASE_ADDR       0x70
    
    /* ===== Dev Type Definition ===== */
    /* pca9544 channel list */
    typedef enum
    {
        PCA9544_CH_NULL = 0,
        PCA9544_CHO = 4,
        PCA9544_CH1 = 5,
        PCA9544_CH2 = 6,
        PCA9544_CH3 = 7,
    }PCA9544_CH_E;
    
    /* pca9544 parameters configuration */
    typedef struct
    {
        /* pca9544 i2c address */
        uint8_t dev_addr;
        /* pca9544 interrupt status */
        uint8_t irq_status;
        /* the current pca9544 channel */
        PCA9544_CH_E pca9544_ch;
        /* the sub dev addr for the selected pca9544 channel */
        uint8_t subdev_addr;
        //uint8_t control_reg;
        /* the sub dev register address */
        uint8_t reg_addr;
    }PCA9544_DEV_CFG_T;                                         

    PCA9544には4つの選択可能なチャネルがあり、元のストロボ値は4/5/6/7であり、列挙はパッケージ化に使用されています。

    PCA9544のI2Cアドレスはハードウェアを介して構成されます。ここでは0x70です。

    詳細については、components /周辺機器/i2c_muxer/pca9544.hを参照してください

  • 初期化
i2c_dev_t i2c;                                               
PCA9544_DEV_CFG_T dev_cfg;

dev_cfg.dev_addr = PCA9544_BASE_ADDR;
dev_cfg.pca9544_ch = test_chan;
dev_cfg.subdev_addr = 0x32;
dev_cfg.reg_addr = 0x10;

i2c.port = 1;
i2c.config.address_width = 8;
i2c.config.freq = I2C_BUS_BIT_RATES_100K;
i2c.config.dev_addr = dev_cfg.dev_addr;

/* I2C Initialization */
ret = hal_i2c_init(&i2c);
if (ret) {
    printf("=====i2c test : i2c 1 dev init fail =====\r\n");
    return -1;

}

/* I2C MUXer PCA9544 Initialization */
ret = pca9544_init(&i2c, &dev_cfg);
if (ret) {
    printf("=====pca9544 test : init fail =====\r\n");
    return -1;

}
  • PCA9544初期化の具体的な実現:
/**********************************************************
 * @fun    PCA9544_init
 * @breif  pca9544 initialization                                
 * @param  i2c:the pointer for i2c configuration
 * @param  dev_cfg: the pointer for dev configuration
 * @rtn
 *********************************************************/
int pca9544_init(i2c_dev_t *i2c, PCA9544_DEV_CFG_T* dev_cfg)
{
    int ret = 0;

    if(i2c == NULL)
    {
        printf("PCA9544 i2c is null\n");
        return -1;
    }

    memset(&g_pca9544_i2c_cfg, 0, sizeof(i2c_dev_t));
    memcpy(&g_pca9544_i2c_cfg, i2c, sizeof(i2c_dev_t));

    ret = hal_i2c_init(&g_pca9544_i2c_cfg);
    if(ret)
    {
        printf("Host I2C open failed\n");
        hal_i2c_finalize(&g_pca9544_i2c_cfg);
        return -1;
    }

    if(dev_cfg == NULL)
    {
        printf("PCA9544 cfg is null\n");
        return -1;
    }
    memset(&g_pca9544_dev_cfg, 0, sizeof(PCA9544_DEV_CFG_T));
    memcpy(&g_pca9544_dev_cfg, dev_cfg, sizeof(PCA9544_DEV_CFG_T));

    printf("PCA9544 cfg is successful\n");
    return ret;
                                                                    
}
  • PCA9544のレジスタ構成、チャネル選択構成は次のとおりです。
/* chan select */
printf("=====i2c test : set chan 2[%d] of PCA9544=====\r\n", test_chan);
ret = pca9544_set_chan(test_chan);
osDelay(2);
read_chan = pca9544_read_chan();

printf("=====I2C Muxer test : read chan val of PCA9544 is %d=====\r\n", read_chan);
  • この時点で、PCA9544のチャネルゲーティングが完了しています。リードバック検証は次のとおりです。
osDelay(2);                                                      
/*if((reg & reg_rtn) == reg)*/
if(test_chan == read_chan)
{
    printf("=====I2C Muxer test : PCA9544 test:  PASS=====\r\n");
}
else
{
    printf("=====I2C Muxer test : PCA9544 test:  FAIL=====\r\n");
    ret = -1;
}

リードバック値がプリセット値と等しい場合、構成は成功し、その逆も同様です。

 

実地試験

  • 全体的なテストコードはhelloworld_demoに基づいて変更でき、特定の場所はapplication / example / helloworld_demo /appdemo.cです。

完成したテストコードは次のとおりです

/*
 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
 */

#include <stdio.h>
#include <stdlib.h>
#include <aos/errno.h>
#include <aos/kernel.h>
#include "aos/init.h"
#include "board.h"
#include <k_api.h>
#include "pca9544.h"
#include "aos/hal/i2c.h"

static int32_t i2c_test_process()
{
    int32_t ret;

    char data[7] = {0x01, 1, 1, 1, 7, 9, 20};
    char data_rtn[7] = {0};
    uint16_t size = 7;
    PCA9544_CH_E test_chan = PCA9544_CH1;
    PCA9544_CH_E read_chan = PCA9544_CH_NULL;
    uint8_t reg_rtn;
    uint8_t chan_mask = 0x05;

    i2c_dev_t i2c;
    PCA9544_DEV_CFG_T dev_cfg;

    dev_cfg.dev_addr = PCA9544_BASE_ADDR;
    dev_cfg.pca9544_ch = test_chan;
    dev_cfg.subdev_addr = 0x32;
    dev_cfg.reg_addr = 0x10;

    i2c.port = 1;
    i2c.config.address_width = 8;
    i2c.config.freq = I2C_BUS_BIT_RATES_100K;
    i2c.config.dev_addr = dev_cfg.dev_addr;

    ret = hal_i2c_init(&i2c);
    if (ret) {
        printf("=====i2c test : i2c 1 dev init fail =====\r\n");
        return -1;

    }

    ret = pca9544_init(&i2c, &dev_cfg);
    if (ret) {
        printf("=====pca9544 test : init fail =====\r\n");
        return -1;

    }

    /* chan select */
    printf("=====i2c test : set chan 2[%d] of PCA9544=====\r\n", test_chan);
    ret = pca9544_set_chan(test_chan);
    osDelay(2);
    read_chan = pca9544_read_chan();

    printf("=====I2C Muxer test : read chan val of PCA9544 is %d=====\r\n", read_chan);

    osDelay(2);
    /*if((reg & reg_rtn) == reg)*/
    if(test_chan == read_chan)
    {
        printf("=====I2C Muxer test : PCA9544 test:  PASS=====\r\n");
    }
    else
    {
        printf("=====I2C Muxer test : PCA9544 test:  FAIL=====\r\n");
        ret = -1;
    }

    
    hal_i2c_finalize(&i2c);

    return 0;

}

static int i2c_autotest()
{
    int32_t ret = 0;

    printf("\r\n\r\n");
    printf("***************************************************************\r\n");
    printf("*************************** I2C&RTC Test **********************\r\n");
    printf("***************************************************************\r\n");
    printf("** Note: this test don't need to connect any external tool   **\r\n");
    printf("** How to test: this test is a autotest                      **\r\n");
    printf("** Process 1.1 set chan1(0x05) for PCA9544 by i2c            **\r\n");
    printf("** Process 1.2 read_chan the selected chan no. from PCA9544  **\r\n");
    printf("** Process 2.1 set 20.9.7 1:1:1 to RX8310CE                  **\r\n");
    printf("** Process 2.2 read the current time from RX8310CE           **\r\n");
    printf("***************************************************************\r\n");
    printf("=====i2c test : Start=====\r\n");

    ret = i2c_test_process();
    if(ret)
    {
        printf("\r\n=====i2c test : FAIL ===\r\n");
        return -1;
    }

    printf("\r\n=====i2c test : PASS===\r\n");
    return 0;
}


int application_start(int argc, char *argv[])
{
    int count = 0;

    printf("nano entry here!\r\n");

    i2c_autotest();

    while(1) {
        printf("hello world! count %d \r\n", count++);

        aos_msleep(1000);
    };
}
  • HaaS100電源を接続すると、電源インジケータライトが点灯します
  • コードをコンパイルします。
aos make disclean 
aos make clean
aos make helloworld_demo@haas100 -c config && aos make

注:最初の2つの手順は、環境をクリーンアップし、他の問題の発生を回避することです。

  • コンパイル結果:部分的
Making [email protected]
Making [email protected]

                        AOS MEMORY MAP                            
|=================================================================|
| MODULE                                   | ROM       | RAM      |
|=================================================================|
| arch_armv7m                              | 2174      | 0        |
| board_haas100                            | 2212      | 6815812  |
| cli                                      | 6918      | 373      |
| debug                                    | 9696      | 132      |
| helloworld_demo                          | 1807      | 12       |
| i2c_muxer                                | 632       | 25       |
| kernel_init                              | 359       | 12       |
| kv                                       | 3297      | 36       |
| libc_nano                                | 20270     | 3911     |
| libgcc                                   | 3612      | 0        |
| libhaas1000                              | 597823    | 921102   |
| libm                                     | 18820     | 1594     |
| lwip                                     | 38935     | 3281     |
| mcu_haas1000                             | 33057     | 3206     |
| newlib_stub                              | 614       | 0        |
| osal_aos                                 | 1096      | 0        |
| osal_posix                               | 129       | 136      |
| rhino                                    | 13739     | 18262    |
| ulog                                     | 1519      | 331      |
| vfs                                      | 1092      | 1113     |
| yloop                                    | 1336      | 32       |
| *fill*                                   | 4978950   | 71513    |
|=================================================================|
| TOTAL (bytes)                            | 5738087   | 7840883  |
|=================================================================|
gen signature and release image ...
OUTPUT_DIR is out/helloworld_demo@haas100
format wrong
/workspace/haas/test_senmu_0819/platform/mcu/haas1000/release/auto_build_tool
['chmod', '777', '/workspace/haas/test_senmu_0819/platform/mcu/haas1000/release/auto_build_tool/bes_sign_tool']
Start chmod sign dir...
chmod sign dir done.

Start make littlefs
Debug output enabled
/demo
file size: 21
genfs done. 
Littlefs code size:4907008
Make littlefs done
cp -f ../../prebuild/factory.bin ../release_bin/
cp -f ../../prebuild/littlefs.bin ../release_bin/
cp -f ../../prebuild/data ../release_bin/
cp -f ../../prebuild/pub_otp.bin ../release_bin/
cp -f ../../prebuild/ota_boot2a.bin ../release_bin/
cp -f ../../prebuild/boot_info.bin ../release_bin/
cp -f ../../prebuild/ota_boot1.bin ../release_bin/
cp -f ../../prebuild/ota_boot1_sec.bin ../release_bin/
cp -f ../../prebuild/programmer2001.bin ../release_bin/
cp /workspace/haas/test_senmu_0819/out/helloworld_demo@haas100/binary/*@haas100.bin ../release_bin/ota_rtos.bin
/workspace/haas/test_senmu_0819/out/helloworld_demo@haas100/binary/[email protected]
cp -f ../write_flash_gui/dld_cfg/haas1000_dld_cfg.yaml ../write_flash_gui/
cp -f ../write_flash_gui/haas1000_dld_cfg.yaml ../write_flash_gui/haas1000_dld_cfg.yaml
cp -f ../release_bin/programmer2001.bin  ../write_flash_tool/tools/
cp -f ../release_bin/programmer2001.bin  ../write_flash_gui/
cp -f ../release_bin/factory.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/factory.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/littlefs.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/littlefs.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/ota_rtos.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/ota_rtos.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/pub_otp.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/pub_otp.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/ota_boot2a.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/ota_boot2a.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/boot_info.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/boot_info.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/ota_boot1.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/ota_boot1.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/ota_boot1_sec.bin ../write_flash_tool/ota_bin/
cp -f ../release_bin/ota_boot1_sec.bin ../write_flash_gui/ota_bin/
cp -f ../release_bin/ota_boot1_sec.bin ../write_flash_gui/ota_bin/
all files done.
gen ota image ...
Build complete: helloworld_demo@haas100
  • グラフィカル書き込みツールを使用して、ファームウェアを書き込みます。

ファームウェアの場所:./ platform / mcu / haas1000 / release / write_flash_gui

以前に書き込みを行ったことがある場合は、上記のフォルダーにあるota_bin /ota_rtos.binファイルを直接置き換えることができます。

  • 書き込みツールのスクリーンショットは次のとおりです。

image.png

図5HaaS100の書き込みのスクリーンショット

  • 書き込みが完了したら、書き込みツールのシリアル接続を停止し、Micro USBケーブルを使用してHaaS100をPCに接続します。これがWin10環境で、シリアルツールを開き、次の設定を行います。シリアル番号は実際の状況に基づいており、ボーレートを1500000に設定する必要があります。 0)

image.png

図6HaaS100シリアルポート設定

  • シリアルポートターミナルを開き、HaaS100再起動ボタンを押して、次のテスト結果を出力します。
***************************************************************
*************************** I2C&RTC Test **********************
***************************************************************
** Note: this test don't need to connect any external tool   **
** How to test: this test is a autotest                      **
** Process 1.1 set chan1(0x05) for PCA9544 by i2c            **
** Process 1.2 read_chan the selected chan no. from PCA9544  **
** Process 2.1 set 20.9.7 1:1:1 to RX8310CE                  **
** Process 2.2 read the current time from RX8310CE           **
***************************************************************
=====i2c test : Start=====
PCA9544 cfg is successful
=====i2c test : set chan 2[5] of PCA9544=====
=====I2C Muxer test : read chan val of PCA9544 is 5=====
=====I2C Muxer test : PCA9544 test:  PASS=====

これまでに、HaaS100のI2C初期化とPCA9544のチャネルゲーティングが完了しました。

 

結論

HaaS100のI2Cには詳細が含まれています。次の一連の記事で紹介します。次回は、mux_i2cの一般的なインターフェイスを紹介します。

 

概要

さらに技術的なサポートが必要な場合は、Dingding DeveloperGroupに参加できます

テクノロジーとソリューションの詳細については、AliyunAIoTホームページhttps://iot.aliyun.com/をご覧ください。

 

おすすめ

転載: blog.csdn.net/HaaSTech/article/details/112114152