树莓派(Raspberry Pi)python smbus 函数说明

系统 1534 0

刚开始学习树莓派,在使用I2C接口时遇到了一些问题,比如不了解smbus有那些函数和这些函数的使用方法,网上找了很久也没有找到具体说明smbus函数的文档,现将我整理的一些说明资料归档如下,一方面便于自己后期学习,二方面便于刚接触树莓派,想要更深入学习I2C接口功能的朋友们,希望对大家有所帮助:

       使用方法:

首先在程序中导入“smbus”模块,方法如下:

            
              #导入方法一:
import smbus

#导入方法二:
from smbus import SMBus

#创建一个smbus实例
b = smbus.SMBus(1)

b = SMBus(1)    # 0 代表 /dev/i2c-0, 1 代表 /dev/i2c-1
                #具体看使用的树莓派那个I2C来决定。

#实例创建好了就可以使用i2c函数了
b.read_byte_data(0x2f,0x58)

            
          

 

 

function

description

parameters

return value

 

                                                                                SMBus Access

 

write_quick (addr)

Quick transaction.

int addr

long

 

read_byte (addr)

Read Byte transaction.

int addr

long

 

write_byte (addr, val)

Write Byte transaction.

int addr, char val

long

 

read_byte_data (addr, cmd)

Read Byte Data transaction.

int addr, char cmd

long

 

write_byte_data (addr, cmd, val)

Write Byte Data transaction.

int addr, char cmd, char val

long

 

read_word_data (addr, cmd)

Read Word Data transaction.

int addr, char cmd

long

 

write_word_data (addr, cmd, val)

Write Word Data transaction.

int addr, char cmd, int val

long

 

process_call (addr, cmd, val)

Process Call transaction.

int addr, char cmd, int val

long

 

read_block_data (addr, cmd)

Read Block Data transaction.

int addr, char cmd

long [ ]

 

write_block_data (addr, cmd, vals)

Write Block Data transaction.

int addr, char cmd, long [ ]

None

 

block_process_call (addr, cmd, vals)

Block Process Call transaction.

int addr, char cmd, long [ ]

long [ ]

 

                                                                                 I2C Access

 

read_i2c_block_data (addr, cmd)

Block Read transaction.

int addr, char cmd

long [ ]

 

write_i2c_block_data (addr, cmd, vals)

Block Write transaction.

int addr, char cmd, long [ ]

None

函数介绍:

Checking For Connected Devices

At the command prompt type one of these depending on whether you are using the I2C0 or I2C1 port: 

            
              sudo i2cdetect -y 0
//or
sudo i2cdetect -y 1

            
          

The 7 bit I2C address of all found devices will be shown (ignoring the R/W bit, so I2C address 0000 0110 is displayed as hex 03).

SMBus (System Management Bus) is a subset from the I2C protocol
When writing a driver for an I2C device try to use the SMBus commands if possible (if the device uses only that subset of the I2C protocol) as it makes it possible to use the device driver on both SMBus adapters and I2C adapters.

Note address is the 7 bit address excluding the read / write bit (it will be shifted left 1 bit when added to the read/write bit)

            
              # Send only the read / write bit 
long write_quick(int addr)

# Read a single byte from a device, without specifying a device register. 
long read_byte(int addr)

# Send a single byte to a device 
long write_byte(int addr, char val)

# Read Byte Data transaction. 
long read_byte_data(int addr, char cmd)

# Write Byte Data transaction. 
long write_byte_data(int addr, char cmd, char val)

# Read Word Data transaction. 
long read_word_data(int addr, char cmd)

# Write Word Data transaction. 
long write_word_data(int addr, char cmd, int val)

# Process Call transaction. 
long process_call(int addr, char cmd, int val)

#Read Block Data transaction.  
long[] read_block_data(int addr, char cmd)
    
# Write up to 32 bytes to a device.  This fucntion adds an initial byte indicating the 
# length of the vals array before the valls array.  Use write_i2c_block_data instead! 
write_block_data(int addr,char cmd,long vals[])

# Block Process Call transaction.  
long[] block_process_call(int addr, char cmd, long vals[])
 
   
# I2C Access Functions
# Block Read transaction. 
long[] read_i2c_block_data(int addr, char cmd)

#Block Write transaction. 
write_i2c_block_data(int addr, char cmd, long vals[])


#Code Example

#!/usr/bin/python

import smbus

bus = smbus.SMBus(1)    # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

DEVICE_ADDRESS = 0x15      #7 bit address (will be left shifted to add the read write bit)
DEVICE_REG_MODE1 = 0x00
DEVICE_REG_LEDOUT0 = 0x1d

#Write a single register
bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, 0x80)

#Write an array of registers
ledout_values = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT0, ledout_values)

            
          

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

            
               
            
          

 

            
               
            
          
            
               
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论