i2c說明及python案例(i2c程序代碼)

本文目錄一覽:

樹莓派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-tw/n/200506.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-05 20:01
下一篇 2024-12-05 20:01

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論