I2CDevice เป็นเฟรมเวิร์ก Python ที่มีจุดประสงค์เพื่อจัดการกับรูปแบบการโต้ตอบอุปกรณ์ SMBUS/I2C ทั่วไป
โครงการนี้มีจุดมุ่งหมายเพื่อให้การใช้งานกลุ่มของไลบรารี Python สำหรับอุปกรณ์ I2C ง่ายขึ้นง่ายขึ้นและจัดทำเอกสารด้วยตนเองโดยเนื้อแท้
มันทำได้โดยการแยกคำอธิบายโดยละเอียดของการลงทะเบียนฮาร์ดแวร์และวิธีที่พวกเขาควรจะถูกจัดการเป็นภาษานิยามที่มีโครงสร้าง
โครงการนี้ไม่ได้มีจุดมุ่งหมายที่จะช่วยให้คุณสร้าง API สาธารณะสำหรับอุปกรณ์ Python- ที่ควรสร้างขึ้นบนพื้นฐานของพื้นฐานที่นำเสนอที่นี่
โดยทั่วไปคุณควรตั้งเป้าหมายสำหรับการเป็นตัวแทน 1: 1 ของการลงทะเบียนฮาร์ดแวร์ในอุปกรณ์ที่คุณใช้แม้ว่าคุณจะไม่ได้วางแผนที่จะใช้ฟังก์ชันการทำงานทั้งหมด การใช้ชุดการลงทะเบียนแบบเต็มจะช่วยให้สามารถเพิ่มคุณสมบัติใหม่ในอนาคตได้อย่างง่ายดาย
ตรวจสอบไลบรารีที่ระบุไว้ด้านล่างสำหรับตัวอย่างในโลกแห่งความเป็นจริง
512ms ) เพื่อลงทะเบียนค่า (เช่น 0b111 ) และกลับมาอีกครั้งgetset พร้อมอาร์กิวเมนต์คำหลัก ตัวอย่างด้านล่างกำหนด ALS_CONTROL register บน LTR559 พร้อมที่อยู่ลงทะเบียน 0x80
มันมี 3 ฟิลด์; Gain - ซึ่งแมปกับค่าโลกแห่งความเป็นจริง - และ SW_RESET/MODE ซึ่งเป็นธงบิตเดี่ยว
ALS_CONTROL = Register ( 'ALS_CONTROL' , 0x80 , fields = (
BitField ( 'gain' , 0b00011100 , values_map = { 1 : 0b000 , 2 : 0b001 , 4 : 0b011 , 8 : 0b011 , 48 : 0b110 , 96 : 0b111 }),
BitField ( 'sw_reset' , 0b00000010 ),
BitField ( 'mode' , 0b00000001 )
))ไม่จำเป็นต้องใช้ตารางการค้นหาสำหรับค่าอย่างไรก็ตามฟังก์ชั่นสามารถใช้ในการแปลค่าจากและไปยังรูปแบบที่อุปกรณ์เข้าใจ
ตัวอย่างด้านล่างใช้ i2cdevice._byte_swap เพื่อเปลี่ยน endianness ของค่า 16 บิตสองค่าก่อนที่พวกเขาจะถูกจัดเก็บ/เรียกคืน
# This will address 0x88, 0x89, 0x8A and 0x8B as a continuous 32bit register
ALS_DATA = Register ( 'ALS_DATA' , 0x88 , fields = (
BitField ( 'ch1' , 0xFFFF0000 , bitwidth = 16 , values_in = _byte_swap , values_out = _byte_swap ),
BitField ( 'ch0' , 0x0000FFFF , bitwidth = 16 , values_in = _byte_swap , values_out = _byte_swap )
), read_only = True , bitwidth = 32 ) "ลงทะเบียน" และ "Bitfield" กำหนดชุดของกฎและตรรกะสำหรับรายละเอียดเกี่ยวกับการลงทะเบียนฮาร์ดแวร์ซึ่งตีความโดยคลาสอุปกรณ์ การลงทะเบียนจะถูกประกาศบนอุปกรณ์โดยใช้ registers=() อาร์กิวเมนต์คำหลัก:
I2C_ADDR = 0x23
ltr559 = Device ( I2C_ADDR , bit_width = 8 , registers = (
ALS_CONTROL ,
ALS_DATA
)) หนึ่งที่กำหนดค่าฟิลด์ของการลงทะเบียนสามารถอ่านเป็น namedtuple โดยใช้วิธี get :
register_values = ltr559 . get ( 'ALS_CONTROL' )
gain = register_values . gain
sw_reset = register_values . sw_reset
mode = register_values . mode NamedTuple ที่ส่งคืนจาก get ไม่เปลี่ยนรูปและไม่พยายามแมปค่ากลับไปยังฮาร์ดแวร์เพื่อที่จะเขียนหนึ่งช่องหรือมากกว่าไปยังการลงทะเบียนที่คุณต้องใช้ set กับอาร์กิวเมนต์คำหลักสำหรับแต่ละฟิลด์:
ltr559 . set ( 'ALS_CONTROL' ,
gain = 4 ,
sw_reset = 1 )สิ่งนี้จะอ่านสถานะการลงทะเบียนจากอุปกรณ์อัปเดต BitFields ตามนั้นและเขียนผลลัพธ์กลับมา