硬件:TPYboard一块,STM32F405,168MHz,Micropython

外设:AD7705,TM7705,16位AD,SPI接口

原因:由于STM32F405内置ADC精度不够,满足不了项目需求,故外置AD7705(淘宝,买现成的电路板),ADS1256(24位)。乘着国庆大假期间,先把AD7705的驱动编号。ADS1256还没有到货。

历时48小时,熟读AD7705 pdf,参考AD7705的C版本程序,改编,用python实现驱动,TPYBoard给出的SPI驱动有OLED,5110显示例程,可以参考。

代码(部分):如有需要,请email:ra00103@163.com,QQ:16183870

import pyb

import time
from pyb import SPI,Pin
class ADS7705:
    #/* 寄存器选择  RS2 RS1 RS0  */
    REG_COMM   = 0x00 #,  /* 通信寄存器 */
    REG_SETUP  = 0x10 #,  /* 设置寄存器 */
    REG_CLOCK  = 0x20 #,  /* 时钟寄存器 */
    REG_DATA   = 0x30 #,  /* 数据寄存器 */
    REG_ZERO_CH1= 0x60 #, /* CH1 偏移寄存器 */
    REG_FULL_CH1= 0x70 #, /* CH1 满量程寄存器 */
    REG_ZERO_CH2= 0x61 #, /* CH2 偏移寄存器 */
    REG_FULL_CH2= 0x71 #, /* CH2 满量程寄存器 */
        #/* 读写操作 */
    WRITE  = 0x00 #,  /* 写操作 */
    READ   = 0x08#,   /* 读操作 */
        #/* 通道 */
    CH_1   = 0#,  /* AIN1+  AIN1- */
    CH_2   = 1#,  /* AIN2+  AIN2- */
    CH_3   = 2#,  /* AIN1-  AIN1- */
    CH_4   = 3#       /* AIN1-  AIN2- */
    MD_NORMAL      = (0 << 6)#, /* 正常模式 */
    MD_CAL_SELF        = (1 << 6)#, /* 自校准模式 */
    MD_CAL_ZERO        = (2 << 6)#, /* 校准0刻度模式 */
    MD_CAL_FULL        = (3 << 6)#, /* 校准满刻度模式 */
    GAIN_1     = (0 << 3)#, /* 增益 */
            #GAIN_2            = (1 << 3),  /* 增益 */
            #GAIN_4            = (2 << 3),  /* 增益 */
            #GAIN_8            = (3 << 3),  /* 增益 */
            #GAIN_16           = (4 << 3),  /* 增益 */
            #GAIN_32           = (5 << 3),  /* 增益 */
            #GAIN_64           = (6 << 3),  /* 增益 */
            #GAIN_128      = (7 << 3),  /* 增益 */
            #/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
    BIPOLAR    = (0 << 2)#, /* 双极性输入 */
    UNIPOLAR   = (1 << 2)#, /* 单极性输入 */
    BUF_NO = (0 << 1)#, /* 输入无缓冲(内部缓冲器不启用) */
    BUF_EN = (1 << 1)#, /* 输入有缓冲 (启用内部缓冲器) */
    FSYNC_0    = 0#,
    FSYNC_1    = 1#       /* 不启用 */
    CLKDIS_0   = 0x00#,       /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
    CLKDIS_1   = 0x10#,       /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */
        #/*
        #  2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
        #  1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  “1”
        #*/
    CLK_4_9152M = 0x08 #,
    CLK_2_4576M = 0x00 #,
    CLK_1M     = 0x04 #,
    CLK_2M     = 0x0C #,
    FS_50HZ    = 0x00 #,
    FS_60HZ    = 0x01 #,
    FS_250HZ   = 0x02 #,
    FS_500HZ   = 0x04 #,

    ZERO_0     = 0x00#
    ZERO_1     = 0x80
    def __init__(self,drdy,ce,rst,sck,di,do,softspi):
        # init the SPI bus and pins
        #spi.init(spi.MASTER, baudrate=328125,prescaler=32,bits=8, polarity=0, phase=1, firstbit=spi.MSB)
        #self.spi=spi
        if(softspi==1):
         drdy.init(drdy.IN, drdy.PULL_UP)  # Data ready
         ce.init(ce.OUT_PP,ce.PULL_NONE)  #chip enable pin
         rst.init(rst.OUT_PP,rst.PULL_NONE)
         sck.init(sck.OUT_PP,sck.PULL_NONE)
         di.init(di.OUT_PP,di.PULL_NONE)
         do.init(do.IN, do.PULL_NONE)  # Data ready
         rst.value(1)
         ce.value(1)
         sck.value(1)
         di.value(1)
         self.sck=sck
         self.di=di
         self.do=do
         self.softspi=softspi
         self.ce=ce
         self.drdy=drdy
         self.rst=rst
         self.sodtspi=softspi
        else:
         drdy.init(drdy.IN, drdy.PULL_UP)  # Data ready
         ce.init(ce.OUT_PP,ce.PULL_NONE)  #chip enable pin
         rst.init(rst.OUT_PP,rst.PULL_NONE)
         rst.value(1)
         ce.value(1)
         SPI    = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK/DO=>X7
         SPI.init(SPI.MASTER,prescaler=64,bits=8, polarity=1, phase=1, firstbit=SPI.MSB)
         self.spi=SPI
         self.ce=ce
         self.drdy=drdy
         self.rst=rst
         self.softspi=softspi
        self.sleep_ms(10)
        self.AD7705_ResetHard()
        self.sleep_ms(10)
        self.AD7705_SyncSPI()
        self.AD7705_IntiCh()
        #self.AD7705_CalibSelf(1)
        #self.sleep_ms(5)
        #/* 配置时钟寄存器 */
        #self.AD7705_WriteByte(self.REG_CLOCK | self.WRITE | self.CH_1)#;          /* 先写通信寄存器,下一步是写时钟寄存器 */
        #self.AD7705_WriteByte(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ);   /* 刷新速率50Hz */
        #//TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ);    /* 刷新速率500Hz */
        #/* 每次上电进行一次自校准 */
        #TM7705_CalibSelf(1);  /* 内部自校准 CH1 */
        self.sleep_ms(5);
    def sleep_ms(self, mseconds):
        try:
            time.sleep_ms(mseconds)
        except AttributeError:
            machine.delay(mseconds)
    def sleep_us(self, useconds):
        try:
            time.sleep_us(useconds)
        except AttributeError:
            machine.udelay(useconds)
#**************************************************************************************
#*
    def AD7705_IntiCh(self):
        self.AD7705_WriteByte(self.REG_CLOCK | self.WRITE | self.CH_1)# 先写通信寄存器,下一步是写时钟寄存器 */
        self.AD7705_WriteByte(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ)#刷新速率50Hz */
        self.AD7705_WriteByte(0x10)#; /*选择设置寄存器,使用chnanel 1*/
        self.AD7705_WriteByte(0x44)#; //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
#  if(_ch==1):
       #    self.AD7705_Send8Bit(0x20)#; /* 写通讯寄存器选中ch1*/
           #self.AD7705_Send8Bit(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ);#    /* 刷新速率50Hz */)#     /*4.9152MHz,
        #   self.AD7705_Send8Bit(0x0C)
         #  self.AD7705_Send8Bit(0x10)#; /*选择设置寄存器,使用chnanel 1*/
          # self.AD7705_Send8Bit(0x40)#; //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
        #else:
         #  self.AD7705_Send8Bit(0x21)#; /* 写通讯寄存器选中ch2 */
          # self.AD7705_Send8Bit(0x06)#; /* 2.4576MHz时钟,50Hz数据更新速率 */
           #self.AD7705_Send8Bit(0x11)#; /*选择设置寄存器,使用chnane 2*/
           #self.AD7705_Send8Bit(0x44)#; //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
#*********************************************************************************************************
#* 函 数 名: AD7705_ResetHard
#* 功能说明: 硬件复位 TM7705芯片
#* 形    参: 无
#* 返 回 值: 无
#********************************************************************************************************
    def AD7705_ResetHard(self):
        self.rst.value(1)#RESET_1()
        self.sleep_ms(1) #bsp_DelayMS(1)
        self.rst.value(0)#RESET_0()
        self.sleep_ms(2)    #bsp_DelayMS(2)
        self.rst.value(1)#RESET_1()
        self.sleep_ms(1) #bsp_DelayMS(1)
        print("Rest OK")
       # self.sleep_ms(2000)
#*************************************************************
#SPI    = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
            #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
            #CLK =>SPI(1).SCK  'X6' SPI clock
CE     = pyb.Pin('X2')
DRDY   = pyb.Pin('X4')
RST    = pyb.Pin('X3')
SCK    = pyb.Pin('X6')
DI     = pyb.Pin('X8')
DO     = pyb.Pin('X7')
ads7705 =ADS7705(DRDY,CE,RST,SCK,DI,DO,0)
print("Init OK")
#print(ads7705.drdy,ads7705.drdy.value())
#print(ads7705.ce,ads7705.ce.value())
while(1):
   v=ads7705.AD7705_Average(1,10)
   print(v)
      #ads7705.sleep_ms(10)
            #ads1256.AD7705_ReAD7705hipID()

TPYBoard MircoPython 外接SPI AD7705相关推荐

  1. 基于ST MCU( STM32L431RCTx) SPI模块外接SPI FALSH的案例

    文章目录 1.相关开发环境 2.SPI1 外接SPI FLASH 3.SPI FLASH初始化 3.1 SPI FLASH支持SPI MODE0/3的通讯控制 3.2 SPI 硬件CRC 不需要DIS ...

  2. 如何给ESP32选择外接SPI Flash

    给ESP32选择外接SPI Flash [前言]:  许多用户在使用 ESP32 做开发的时候,都会碰到如何选择外接 Flash 的难题,因为不同厂商的 Flash 存在很多差异,Flash 支持的工 ...

  3. PX4原生固件SPI驱动动编写与IMU传感器替换

    适用于PX4原生固件 核心目标:完成XSENS的MTI3,IMU替换.MTI3是一款航姿参考系统,可以独立的输出四元数,加速度,磁力计等,角速度等航姿信息.里面有完整的卡尔曼滤波,可以替换飞控本身里面 ...

  4. ESP32 SPI 接口的应用

    总体介绍 1. ESP32 共有 4 个 SPI 控制器 SPI0.SPI1.SPI2.SPI3,用于连接支持 SPI 协议的设备. SPI0 控制器作为 cache 访问外部存储单元接口使用; SP ...

  5. 解决STM32虚拟U盘枚举过慢的问题

    1.最近在一个项目中使用STM32虚拟U盘功能,外接SPI flash,连接到电脑上面后虚拟出一个U盘出来,软件使用RT thread的usb device, mass storte大容量存储设备.代 ...

  6. 零基础ESP8266学习篇-认识esp8266

    ESP8266芯片是乐鑫公司于2015年推出的一款集成MCU的WIFI芯片. 所谓的MCU,既微控制单元(MCU),可称单片微型计算机,是把中央处理器(CPU)的频率与规格做适当缩减,并将内存.计数器 ...

  7. ESP8266 下载模式 GPIO 研究

    首先 找到ESP8266 的芯片手册 https://www.espressif.com/zh-hans/products/hardware/esp8266ex/overview ESP8266EX技 ...

  8. (ESP32学习1)IO的输出高低电平与上下拉输入

    使用的是Arduino IDE , 函数非常简单,但有一些需要注意的地方,我第一篇文章是给IDE换主题,大家有不喜欢目前IDE配色主题的可以去看看 先给大家看看ESP32的外设图 开启输出模式的关键字 ...

  9. 【复习】复习之学习笔记

    持续更新... //========================================================================================= ...

  10. 基于msm8909调试mcp2515 can芯片

    在高通msm8909上调试mcp2515芯片,使用的模块是飞凌嵌入式的mcp2515模块 原理图 1.飞线,需要电压转换芯片,使用的是TXB1080芯片(TXS1080针对spi有问题),5V供电mc ...

最新文章

  1. AI工程的实践者:普元积极将场景落地,为企业提供智能化解决方案
  2. wpf 加载html页面,使用MVVM在WPF中显示HTML
  3. python 完全面向对象_史上最全的Python面向对象知识点疏理
  4. C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
  5. Visual C++中的异常处理浅析(上)
  6. Android Ant 和 Gradle 打包流程和效率对照
  7. c语言赋值运算符左边必须是,C语言运算符入门讲解
  8. 苹果高通虽已和解 但5G iPhone最快仍要明年才能推出
  9. dart调用python_Dart - Isolate 并发
  10. JavaScript高级使用(一)--参数Arguments对象
  11. MySQL复习(基本操作)
  12. Linux RPM软件包管理
  13. 【mysql】扩展-变量_存储过程_函数
  14. MVC获取客户端IP地址方法
  15. QT目录遍历(QDir)
  16. unity中实现多人联机局域网-基于pun v2 + photon server v5
  17. 纳韦斯托克斯方程的推导_什么是纳维-斯托克斯方程?
  18. 文件上传漏洞(客户端绕过,MIMEtipe绕过,getimagesize绕过)
  19. 陈表达VBA笔记---VBA一键删除空白行
  20. dbpedia知识图谱java_一种基于DBpedia的水务领域概念知识图谱构建方法与流程

热门文章

  1. 基于HAL库使用cubemx配置,驱动MAX30102血氧传感器基础历程
  2. win10家庭版升级为专业版
  3. 京瓷1125打印机清零_怎么设置京瓷1125MFP打印机ip地址
  4. ssd网络结构简单说明
  5. java 圣思园_圣思园Java8新特性及实战视频教程完整版1
  6. 小学计算机说课稿,小学计算机说课稿_相关文章专题_写写帮文库
  7. sata AHCI驱动下载(AMD Intel Nvidia)
  8. win10找回windows照片查看器的方法
  9. 小程序下拉刷新,如何等待数据返回再收起loading
  10. 利用imageai做一个物体检测系统