本文目錄一覽:
樹莓派python支持i2c嗎
樹莓派的GPIO端口數量有限,可通過IO擴展芯片增加GPIO的數量,使得樹莓派可以適應更多的應用。PCF8574為一款通過I2C總線擴展IO的芯
片,單個PCF8574可擴展8個IO,一個I2C總線最多可掛載8個PCF8574,所以樹莓派最多可擴展64個IO。
樹莓派擴展功能的開發方法有很多,例如wiringPi和bcm2835 C library都提供I2C
API函數。如果使用python+SMBUS庫開發的話,你會發現Linux應用開發原來如此簡單。(注意SMBUS和I2C存在區別與聯繫,在本文中
兩者是相等的概念)
2.相關博文
【樹莓派學習筆記——I2C設備載入和速率設置】
【樹莓派學習筆記——I2C Tools 學習筆記】
【樹莓派學習筆記——I2C PCF8574 BCM2835 Library】使用BCM2835
Library實現本文相同的內容
【樹莓派學習筆記——I2C PCF8574 SysFs方式】使用SysFS方式實現本文相同的內容
3.PCF8574使用簡述
PCF8574的採用7位I2C地址,7位I2C地址中的低3位從高到低分別為A2
A1和A0,該3位為地址選擇位,若地址選擇全部接GND,那麼PCF8574的I2C從機地址為0x20。圖1為PCF8574的基本信息,左側為芯片
內部結構示意圖,其中A2
A1和A0決定從機地址而從機地址直接影響I2C總線控制器,右側上部為PCF8574引腳圖,右側下部為I2C從機地址組成示意圖,從機地址的高4位為
0100,該4位數字固定不變。
圖1 PCF8574基本信息
請
注意I2C 7位從機地址和I2C
讀控制字或i2C寫控制器存在聯繫與區別,對於7位從機地址為0x20的PCF8574而言,讀控制字為0x41,寫控制字為0x40。若使用GPIO通
過軟件法模擬I2C時序時,通常把寫控制字0x40定義為I2C從機地址,軟件模擬時的I2C地址(0x40)和I2C
7位從機地址(0x41)存在區別。
PCF8574內部含有8個准雙向IO,對PCF8574進行一次寫操作可修改IO口的輸出狀態,對PCF8574進行一次讀操作可獲取IO口的輸入狀態。I2C總線的操作較為複雜,各芯片之間的差異較大,例如BH1750、AT24C04和ADXL345雖然均使用I2C接口,但是細節之處存在差異較大。
圖2 PCF8574讀寫時序
4.代碼實現——python
【安裝python smbus】
sudo apt-get install python-smbus
新建一個名為pcf8574.py的文件
[python] view plain copy
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import time
# 打開 /dev/i2c-1
bus = smbus.SMBus(1)
while True:
for i in range(0,4):
# 向PCF8574寫入一個字節
bus.write_byte( 0x20 , (1i) )
# 延時100ms
time.sleep(0.1)
【代碼詳解】
【1】#!/usr/bin/env python
定義python解析腳本的絕對路徑。
【2】# -*- coding: utf-8 -*-
py文件為utf-8格式,否則無法寫入中文注釋。
【3】import smbus
導入smbus模塊。
【4】bus = smbus.SMBus(1)
在樹莓派版本2中,I2C設備位於I2C-1,所以此處的編號為1
【5】bus.write_byte( 0x20 , (1i) )
向PCF8574寫入一個字節,注意PCF8574和其他I2C芯片不同,該芯片沒有寄存器,發送寫控制字之後可直接設置IO口輸出狀態。
【執行程序】
進入pcf8574.py所在目錄,輸入以下指令
sudo python pcf8574.py
【運行結果】
圖3 運行結果
5.參考資料
【python SMBUS GitHub】python封裝SMBUS操作函數具體代碼,值得閱讀。
用I2C實現兩單片機聯機,接收程序怎麼寫?
發送和接收差不多,
這裡是個例子,有問題歡迎一起討論
/*****************************************************
/* 文件名 : I2C.h
/* 描述 : I2C.c的頭文件
/* 編寫環境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 學校 : 廣東XX大學
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 編寫日期 : 2008-3-30
/* 僅供學習參考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模擬I2C總線的接口程序庫,主機的程序
/* 應用 : 發送n個字節: 起始位-發送控制字節(類型標識符4位-
片選3位-讀寫位最後1位)-應答位-數據-應答………..應答-終止位
高位先到達,低位後到達
/****************************************************/
#include “reg51.h” /*根據不同主控芯片型號改寫該套入*/
#include “intrins.h”
sbit SCL = P1^6; /*定義SCL線所在口,根據實踐需要改寫該定義*/
sbit SDA = P1^7; /*定義SDA線所在口,根據實踐需要改寫該定義*/
unsigned char idata error; /*錯誤提示,全局變量*/
extern void Start_I2C(void);
extern void Stop_I2C(void);
extern void Ack_I2C(void);
extern void Send_Ack(void);
extern void Send_Not_Ack(void);
extern void Send_I2C(unsigned char send_byte);
extern unsigned char Receive_I2C(void);
/*****************************************************/
/* 文件名 : I2C.c
/* 描述 : I2C通信程序
/* 編寫環境 : Keil uVision 3 V3.51
/* 作者 : XX
/* 學校 : 廣東XX大學
/* Email : lanhaospider@163.com
/* 版本 : V1.0
/* 編寫日期 : 2008-3-30
/* 僅供學習參考
/* 芯片 : MCS-51 AT89S52
/* 晶振 : 11.0592MHz
/* 功能描述 : 模擬I2C總線的接口程序庫,為主機的程序
/*****************************************************/
#include “I2C.h”
/**************************************************
調用方式 : void Start_I2C(void)
函數說明: 啟動I2C總線
**************************************************/
void Start_I2C(void)
{
EA = 0; /*關總中斷*/
SDA = 1; /*發送啟動總線的數據信號*/
SCL = 1; /*發送啟動總線的時鐘信號*/
_nop_(); /*保持數據線高,延時*/
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 0; /*發送起始信號*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0; /*時鐘線高低跳變一次,I2C通信開始*/
}
/**************************************************
調用方式 : void Stop_I2C(void)
函數說明: 關閉I2C總線
**************************************************/
void Stop_I2C(void)
{
SCL = 0; /*發送關閉總線的時鐘信號*/
SDA = 0; /*發送關閉總線的數據信號*/
_nop_();
_nop_();
_nop_(); /*保持數據線低,延時*/
_nop_();
_nop_();
SCL = 1; /*時鐘線一次低高跳變,I2C通信停止*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1; /*發送I2C總線停止數據信號*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EA = 1; /*開總中斷*/
}
/**************************************************
調用方式 : void Ask_I2C(void)
函數說明: 主控程序等待從器件接收方式應答
**************************************************/
void Ack_I2C(void)
{
unsigned char errtimes = 0xFF;
SDA = 1;
SCL = 1;
error = 0x10;
while(SDA)
{
errtimes–;
if(!errtimes)
{
Stop_I2C();
error = 0x11;
return;
}
}
SCL = 0;
}
/**************************************************
調用方式 : void Send_Ask(void)
函數說明: 主控程序為接收方,從器件為發送方時,從
器件等待主器件應答
**************************************************/
void Send_Ack(void)
{
SDA = 0; /*保持數據線低,時鐘線發生一次高低跳變 發送一個應答信號*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; /*時鐘線保持低電平*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/**************************************************
調用方式 : void Send_Not_Ask(void)
函數說明: 主控程序為接收方,從器件為發送方時,非應答信號
**************************************************/
void Send_Not_Ack(void)
{
SDA = 1; /*保持數據線高,時鐘線發生一次高低跳變 沒有應答*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1; /*時鐘線保持高電平*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/**************************************************
調用方式 : void Send_I2C(unsigned char send_byte)
函數說明: 總線發送一個字節
**************************************************/
void Send_I2C(unsigned char send_byte)
{
unsigned char send_bit;
for(send_bit = 8;send_bit = 0;send_bit–)
{
SCL = 0;
_nop_();
SDA = (send_byte 0x80);
send_byte=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
SCL = 0;
}
/**************************************************
調用方式 : unsigned char Receive_I2C(void)
函數說明: 從I2C總線上接收一個字節
**************************************************/
unsigned char Receive_I2C(void)
{
unsigned char receive_bit , receive_byte = 0;
for(receive_bit = 8;receive_bit = 0;receive_bit–)
{
SCL = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
receive_byte =1;
receive_byte |= SDA;
}
SCL = 0;
return receive_byte;
}
樹莓派怎麼樣用 Python 控制 GPIO 來發送串口指令
python GPIO
1、先安裝python-dev,輸入以下指令。
sudo
apt-get install python-dev
2、安裝RPi.GPIO,依次輸入以下指令。
1)下載:$ wget
2)解壓縮:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
3)進入解壓之後的目錄 :$ cd RPi.GPIO-0.5.3a
4)啟動安裝 :$ sudo python setup.py install
3、例子:
[python] view plain copy
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD編號方式,基於插座引腳編號
GPIO.setmode(GPIO.BOARD)
# 輸出模式
GPIO.setup(11, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
4、執行:
sudo python led.py
5、說明:
1)GPIO.setmode(GPIO.BOARD),採用插座引腳編號方式。
2)由於採用插座引腳編號方式,此處的11腳相當於BCM2835寄存器編號方式的引腳11。
python GPIO
1、說明:
WiringPi是應用於樹莓派平台的GPIO控制庫函數,WiringPi遵守GUN Lv3。wiringPi使用C或者C++開發並且可以被其他語言包轉,例如python、ruby或者PHP等。
wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹莓派GPIO管腳。用戶可以利用gpio命令通過shell腳本控制或查詢
GPIO管腳。wiringPi是可以擴展的,可以利用wiringPi的內部模塊擴展模擬量輸入芯片,可以使用
MCP23x17/MCP23x08(I2C
或者SPI)擴展GPIO接口。另外可通過樹莓派上的串口和Atmega(例如arduino等)擴展更多的GPIO功能。另外,用戶可以自己編寫擴展模
塊並把自定義的擴展模塊集成到wiringPi中。WiringPi支持模擬量的讀取和設置功能,不過在樹莓派上並沒有模擬量設備。但是使用
WiringPi中的軟件模塊卻可以輕鬆地應用AD或DA芯片。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200506.html