CH423要如何使用,便宜的国产IO扩展芯片
目錄
前言
特點
如何使用
例子1? 配置輸出
例子2 配置OC1輸出
例子3 配置OC14輸出
前言
有時候會遇到IO不夠用的情況,例如說驅動LED燈,那么有沒有什么便宜的,容易買到的芯片?我這次就考慮使用WCH的CH423S,這是一個比較新的IO擴展芯片。
這一個芯片有最多24個輸出引腳,雙向IO有8個,可以說非常夠用,價格在1.5元上下,并且貨有不少。
特點
●通過兩線串行接口遠程擴展出8個通用輸入輸出引腳GPIO和16個通用輸出引腳GPO。
●內置電流驅動級,連續驅動電流不小于15mA,OC引腳輸出1/16脈沖灌電流不小于120mA。
●靜態顯示驅動方式支持24只發光管LED或者3位共陽數碼管。
●分時動態掃描顯示驅動方式支持128只發光管LED或者16位共陰數碼管,支持亮度控制。
●雙向I/O引腳在輸入方式下具有輸入電平變化時產生中斷的功能,中斷輸出低電平有效。
●16個通用輸出引腳可以選擇推挽輸出或者開漏輸出。●支持3V~5V電源電壓,支持低功耗睡眠,可以被輸入電平變化喚醒。
●高速2線串行接口,時鐘速度從0到1MHz,兼容兩線I2C總線,節約引腳。
●提供DIP28S和SOP28兩種無鉛封裝,兼容RoHS。
看一下原理圖的部分,幾乎不需要外圍電路就可以可靠的運行。
如何使用
我根據官方的代碼進行了一點修改,使得它非常的容易使用
代碼如下,直接抄的官方例子然后簡單修改,我用的是Arduino IDE來測試這一個芯片。
// 硬件相關定義, 請根據實際硬件修改本文件#ifndef CH423_H#define CH423_H#include <arduino.h>#define DELAY_0_1US {delayMicroseconds(5);}/* 2線接口的連接,與實際電路有關 */unsigned int CH423_SCL = 5;unsigned int CH423_SDA = 6;/* 2線接口的位操作,與單片機有關 */#define CH423_SCL_SET { digitalWrite(CH423_SCL,HIGH); }#define CH423_SCL_CLR { digitalWrite(CH423_SCL,LOW); }#define CH423_SCL_D_OUT { pinMode(CH423_SCL,OUTPUT); } // 設置SCL為輸出方向,對于雙向I/O需切換為輸出#define CH423_SDA_SET { digitalWrite(CH423_SDA,HIGH);}#define CH423_SDA_CLR { digitalWrite(CH423_SDA,LOW);}//#define CH423_SDA_IN { digitalRead(CH423_SDA) }#define CH423_SDA_D_OUT { pinMode(CH423_SDA,OUTPUT); } // 設置SDA為輸出方向,對于雙向I/O需切換為輸出#define CH423_SDA_D_IN { pinMode(CH423_SDA,INPUT); } // 設置SDA為輸入方向,對于雙向I/O需切換為輸入// CH423接口定義#define CH423_I2C_ADDR1 0x40 // CH423的地址#define CH423_I2C_MASK 0x3E // CH423的高字節命令掩碼/* 設置系統參數命令 */#define CH423_SYS_CMD 0x4800 // 設置系統參數命令,默認方式#define BIT_X_INT 0x08 // 使能輸入電平變化中斷,為0禁止輸入電平變化中斷;為1并且DEC_H為0允許輸出電平變化中斷#define BIT_DEC_H 0x04 // 控制開漏輸出引腳高8位的片選譯碼#define BIT_DEC_L 0x02 // 控制開漏輸出引腳低8位的片選譯碼#define BIT_IO_OE 0x01 // 控制雙向輸入輸出引腳的三態輸出,為1允許輸出/* 設置低8位開漏輸出命令 */#define CH423_L_CMD 0x0400 // 設置低8位推挽輸出命令,默認方式#define CH423_OC_L_CMD 0x4400 // 設置低8位開漏輸出命令,默認方式#define BIT_OC0_L_DAT 0x01 // OC0為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC1_L_DAT 0x02 // OC1為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC2_L_DAT 0x04 // OC2為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC3_L_DAT 0x08 // OC3為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC4_L_DAT 0x10 // OC4為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC5_L_DAT 0x20 // OC5為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC6_L_DAT 0x40 // OC6為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC7_L_DAT 0x80 // OC7為0則使引腳輸出低電平,為1則引腳不輸出/* 設置高8位開漏輸出命令 */#define CH423_H_CMD 0x0600 // 設置低8位推挽輸出命令,默認方式#define CH423_OC_H_CMD 0x4600 // 設置低8位開漏輸出命令,默認方式#define BIT_OC8_L_DAT 0x01 // OC8為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC9_L_DAT 0x02 // OC9為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC10_L_DAT 0x04 // OC10為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC11_L_DAT 0x08 // OC11為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC12_L_DAT 0x10 // OC12為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC13_L_DAT 0x20 // OC13為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC14_L_DAT 0x40 // OC14為0則使引腳輸出低電平,為1則引腳不輸出#define BIT_OC15_L_DAT 0x80 // OC15為0則使引腳輸出低電平,為1則引腳不輸出/* 設置雙向輸入輸出命令 */#define CH423_SET_IO_CMD 0x6000 // 設置雙向輸入輸出命令,默認方式#define BIT_IO0_DAT 0x01 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO0為0輸出低電平,為1輸出高電平#define BIT_IO1_DAT 0x02 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO1為0輸出低電平,為1輸出高電平#define BIT_IO2_DAT 0x04 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO2為0輸出低電平,為1輸出高電平#define BIT_IO3_DAT 0x08 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO3為0輸出低電平,為1輸出高電平#define BIT_IO4_DAT 0x10 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO4為0輸出低電平,為1輸出高電平#define BIT_IO5_DAT 0x20 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO5為0輸出低電平,為1輸出高電平#define BIT_IO6_DAT 0x40 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO6為0輸出低電平,為1輸出高電平#define BIT_IO7_DAT 0x80 // 寫入雙向輸入輸出引腳的輸出寄存器,當IO_OE=1,IO7為0輸出低電平,為1輸出高電平/* 讀取雙向輸入輸出命令 */#define CH423_RD_IO_CMD 0x4D // 輸入I/O引腳當前狀態// 對外子程序extern void CH423_WriteByte( unsigned short cmd ); // 寫出數據extern unsigned char CH423_ReadByte( void ); // 讀取數據// 特定用途子程序extern void CH423_Write( unsigned short cmd ); // 向CH423發出操作命令,該子程序與CH423_WriteByte不同,區別主要是前者先將命令碼高8位移位// 下述定義僅適用于CH423_Write子程序,這樣定義是為了兼容I2C數據,如果不考慮兼容,那么高8位應該先左移1位#define CH423_DIG0 0x1000 // 數碼管位0顯示#define CH423_DIG1 0x1100 // 數碼管位1顯示#define CH423_DIG2 0x1200 // 數碼管位2顯示#define CH423_DIG3 0x1300 // 數碼管位3顯示#define CH423_DIG4 0x1400 // 數碼管位4顯示#define CH423_DIG5 0x1500 // 數碼管位5顯示#define CH423_DIG6 0x1600 // 數碼管位6顯示#define CH423_DIG7 0x1700 // 數碼管位7顯示#define CH423_DIG8 0x1800 // 數碼管位8顯示#define CH423_DIG9 0x1900 // 數碼管位9顯示#define CH423_DIG10 0x1A00 // 數碼管位10顯示#define CH423_DIG11 0x1B00 // 數碼管位11顯示#define CH423_DIG12 0x1C00 // 數碼管位12顯示#define CH423_DIG13 0x1D00 // 數碼管位13顯示 #define CH423_DIG14 0x1E00 // 數碼管位14顯示 #define CH423_DIG15 0x1F00 // 數碼管位15顯示#endifvoid CH423_I2c_Start( void ) // 操作起始{CH423_SDA_SET; // 發送起始條件的數據信號CH423_SDA_D_OUT; // 設置SDA為輸出方向CH423_SCL_SET;CH423_SCL_D_OUT; // 設置SCL為輸出方向DELAY_0_1US;CH423_SDA_CLR; //發送起始信號DELAY_0_1US; CH423_SCL_CLR; //鉗住I2C總線,準備發送或接收數據}void CH423_I2c_Stop( void ) // 操作結束{CH423_SDA_CLR;DELAY_0_1US;CH423_SCL_SET;DELAY_0_1US;CH423_SDA_SET; // 發送I2C總線結束信號DELAY_0_1US;}void CH423_I2c_WrByte( unsigned char dat ) // 寫一個字節數據{unsigned char i;for( i = 0; i != 8; i++ ) // 輸出8位數據{if( dat&0x80 ) { CH423_SDA_SET; }else { CH423_SDA_CLR; }DELAY_0_1US;CH423_SCL_SET;dat<<=1;DELAY_0_1US; // 可選延時CH423_SCL_CLR;}CH423_SDA_SET;DELAY_0_1US;CH423_SCL_SET; // 接收應答DELAY_0_1US;CH423_SCL_CLR;}unsigned char CH423_I2c_RdByte( void ) // 讀一個字節數據{unsigned char dat,i;CH423_SDA_SET;CH423_SDA_D_IN; // 設置SDA為輸入方向dat=0;for( i = 0; i != 8; i++ ) // 輸入8位數據{DELAY_0_1US; // 可選延時CH423_SCL_SET;DELAY_0_1US; // 可選延時dat<<=1;if(digitalRead(CH423_SDA)==HIGH){dat++; // 輸入1位}CH423_SCL_CLR;}CH423_SDA_SET;DELAY_0_1US;CH423_SCL_SET; // 發出無效應答DELAY_0_1US;CH423_SCL_CLR;return(dat);}void CH423_Write( unsigned short cmd ) // 寫命令{CH423_I2c_Start(); // 啟動總線CH423_I2c_WrByte( ( ( unsigned char )( cmd>>7 ) & CH423_I2C_MASK ) | CH423_I2C_ADDR1 );CH423_I2c_WrByte( ( unsigned char ) cmd ); // 發送數據CH423_I2c_Stop(); // 結束總線}void CH423_WriteByte( unsigned short cmd ) // 寫出數據{CH423_I2c_Start(); // 啟動總線CH423_I2c_WrByte( ( unsigned char )( cmd>>8 ) );CH423_I2c_WrByte( ( unsigned char ) cmd ); // 發送數據CH423_I2c_Stop(); // 結束總線 }unsigned char CH423_ReadByte() // 讀取數據{unsigned char din;CH423_I2c_Start(); // 啟動總線CH423_I2c_WrByte( CH423_RD_IO_CMD ); // 此值為0x4Ddin=CH423_I2c_RdByte(); // 讀取數據CH423_I2c_Stop(); // 結束總線return( din );}void Test(){CH423_WriteByte(CH423_SYS_CMD | BIT_IO_OE );//默認模式CH423_WriteByte(CH423_SET_IO_CMD | BIT_IO1_DAT);//IO1輸出CH423_WriteByte(CH423_OC_L_CMD | BIT_OC0_L_DAT );//OC0輸出delay(1300);CH423_WriteByte(CH423_SET_IO_CMD );//清空輸出CH423_WriteByte(CH423_OC_L_CMD );//清空輸出delay(1300);}
如果要使用,那么只需要修改這幾個地方,首先是通訊的兩線的引腳
然后就可以使用了,為了方便測試我配置了一個Test函數,可以讓OC0和IO1都輸出高電平其他則不輸出。
下面以一些例子來說明如何初始化以及控制CH423s的輸出
例子1? 配置輸出
一開始,先配置為默認模式,發送設置系統參數命令,設置雙向引腳IO0到IO7為輸出模式
CH423_WriteByte(CH423_SYS_CMD | BIT_IO_OE );//默認模式然后,配置IO1為輸出
CH423_WriteByte(CH423_SET_IO_CMD | BIT_IO1_DAT);這樣就可以實現IO1輸出高電平。
例子2 配置OC1輸出
CH423在上電的時候,OC0到OC15這些引腳默認下被配置為推挽輸出
所以只需要
CH423_WriteByte(CH423_OC_L_CMD | BIT_OC1_L_DAT );//OC1輸出就可以讓OC1輸出高電平,其他低電平
例子3 配置OC14輸出
因為有16個輸出腳位(加8個雙向一共24)所以說需要使用另一個代碼來配置OC8到OC15
CH423_WriteByte(CH423_OC_H_CMD | BIT_OC14_L_DAT );//OC14輸出
總結
以上是生活随笔為你收集整理的CH423要如何使用,便宜的国产IO扩展芯片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023美团商家数据
- 下一篇: 浅学rdl报表