概要概要
この記事では、主にハードウェアの状況と、HaaS100I2CおよびI2CMUXerの使用方法を紹介します。
適用範囲
- HaaSおよびI2C周辺機器を知り、学びたい人
- 開発にHaaSI2Cを使用したい開発者
目的
- 完全なオンボードI2CMUXerの初期化、チャネル設定、およびI2Cに基づく読み取り
必要なツール
- HaaS1001 ブロック
- 1セットの電源が含まれています
- マイクロUSBライン 1
- シリアル端子(ここではXshell 6(ビルド0206)を使用)
周辺機器の紹介
I²C(Inter-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)を見てください。
図1一般的なI2Cバス接続
HaaS100I2Cの状況
HaaS100で使用されるHaaS1000メインコントロールチップは、2つのI2Cマスターをサポートします。そのうちの1つはUART2によって多重化され、ボード上の拡張インターフェイスに接続されます。図2のブラックボックスのピンを参照してください。これは、他のI2Cでは一時的に使用できません。リソースはお客様に提供されます。I2CMUXerを使用してI2Cの残りの1チャネルを4チャネルに拡張し、そのうち2つはオンチップで使用され、残りの2つは拡張インターフェイスに接続されています。図2の赤いボックスのピンを参照してください。
図2HaaS拡張スロット
HaaS100ボードでのI2C接続については、図3で強調表示されている部分を参照してください。これらはI2Cに関連する拡張機能です。
図3HaaS100I2C拡張の上面図
HaaS100ボードのI2Cロジックトポロジ図を図4に示します。
図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
処理する:
- 関連マクロ、構造紹介
-
/* ===== 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ファイルを直接置き換えることができます。
- 書き込みツールのスクリーンショットは次のとおりです。
図5HaaS100の書き込みのスクリーンショット
- 書き込みが完了したら、書き込みツールのシリアル接続を停止し、Micro USBケーブルを使用してHaaS100をPCに接続します。これがWin10環境で、シリアルツールを開き、次の設定を行います。シリアル番号は実際の状況に基づいており、ボーレートを1500000に設定する必要があります。 0)
図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/をご覧ください。