• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

TM7705(AD7705)驱动调试-stm32f103zet6-填坑日记

武飞扬头像
向阳花开0926
帮助1

  1. 目录

    AD7705简介

    ADC芯片——AD7705最详细讲解(STM32)http://t.csdn.cn/UbXjw

    工程以及主要代码分享,另外,附带演示视频。


    AD7705简介

  • 学新通

  • 学新通
  • 学新通
  • 模块对输入电压进行了0.5倍的分压,才进入芯片采集。
  • 学新通

一句话说明白,

TM7705是一个外置16位分辨率双通道ADC芯片,SPI通信协议,采用Σ-∆转换技术。

价格便宜,对标同型号AD7705,基本能直接替换,程序基本通用。

  • AD7705和TM7705功能区别:

AD7705是美国模拟器件公司生产的。15元左右。
TM7705 是深圳天微生产的,引脚和功能和AD7705完全兼容。可以替代AD7705。价格比进口的便宜几倍。5元左右。
(1)TM7705多一个内部2.48V参考电压,可以通过写测试寄存器开启(默认不开启)
(2)TM7705多一种时钟设置方法,可以提高精度。时钟寄存器的ZERO 3个bit位中最高位=1来启用。这种模式下,数据刷新率变低(每秒10个样本),精度变高。

学新通

在文末放好调试成功的工程完整文件链接。

这两篇文章是讲解的比较详细的,

ADC芯片——AD7705最详细讲解(STM32)学新通http://t.csdn.cn/UbXjw

STM32F103ZET6驱动TM7705(AD7705)代码加心得学新通http://t.csdn.cn/lWMiE

不过,都没有解决一个实际性的问题,怎么用起来 这个adc

学新通

  1.  第一篇,提供了完整工程链接下载,接口也方便,点赞

学新通

下载收费积分都是次要的。

最重要的一点是,代码问题重重。

经常TIME OUT ,超时

初始化,以及获取一次ADC需要大概10秒。

似乎是偶尔运行成功一样。

程序是存在问题的。

学新通

和作者评论区讨论未果,也许年代久远,作者也难在实际调试

学新通

 此代码实际运行视频我会放在文末链接中。

  •  第二篇,ADC芯片——AD7705最详细讲解(STM32)

驱动原理讲解确实很详细,建议学习时,仔细阅读。点赞

却只给出了C,H文件,

加入工程并不难,不过,代码简单明了,适合老手进阶使用。

缺乏通用性,代码编程风格相比于前一个文章以及安富莱电子得代码来说,规范性上差太多了。

另外,每次获取值,都要初始化一次。似乎存在重复操作。

学新通

 学新通

学新通

adc数据可以获取到,但是TM7705模块DRDY电平一直为高的问题,始终存在。

经过对数据手册的仔细阅读,程序大体流程如下:

学新通

大概可以理解成分布式的寄存器结构。

通信寄存器就是那个大哥,你要动他哪个小弟,怎么动,你都得先告诉他,有的小弟打完了还要告诉大哥结果怎们样。

学新通

不多废话了。直接上代码。

学新通

 优化后,是网上代码-STM32F103ZET6驱动TM7705(AD7705)代码加心得代码修改而来。采用硬件SPI.

另外,自己也写了一个适合更改单片机引脚的软件SPI程序。

工程以及主要代码分享,另外,附带演示视频

百度云学新通https://pan.百度.com/s/1W1pj8wGVMaSwfc3mdO-0ZQ?pwd=6666 

链接:https://pan.百度.com/s/1W1pj8wGVMaSwfc3mdO-0ZQ?pwd=6666 
提取码:6666

学新通

学新通 

 MAIN.C

  1.  
     
  2.  
    #include <delay.h>
  3.  
    #include <sys.h>
  4.  
    #include <usart.h>
  5.  
    #include <lcd.h>
  6.  
    #include <drv_spi.h>
  7.  
    #include <drv_tm7705.h>
  8.  
    char BUFFER[200];
  9.  
    int main(void)
  10.  
    {
  11.  
    int volt1,volt2;
  12.  
    uint16_t adc1,adc2;
  13.  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVUC中断分组为2
  14.  
    uart_init(115200);
  15.  
    delay_init();
  16.  
    LCD_Init();
  17.  
    POINT_COLOR = RED;
  18.  
     
  19.  
    TM7705_Init();
  20.  
    TM7705_CalibSelf(1); //自校准
  21.  
    adc1 = TM7705_ReadAdc(1);
  22.  
    TM7705_CalibSelf(2); //自校准
  23.  
    adc2 = TM7705_ReadAdc(2);
  24.  
    while(1)
  25.  
    {
  26.  
    adc1 = TM7705_ReadAdc(1);
  27.  
    adc2 = TM7705_ReadAdc(2);
  28.  
     
  29.  
    volt1 = (adc1 * 5000) / 65535;
  30.  
    volt2 = (adc2 * 5000) / 65535;
  31.  
     
  32.  
    sprintf(BUFFER,"CH1=] v1:]mv",adc1,volt1);
  33.  
    printf("CH1=] v1:]mv\r\n",adc1,volt1);
  34.  
     
  35.  
     
  36.  
    LCD_ShowString(60,154,200,16,16,BUFFER);
  37.  
     
  38.  
    sprintf(BUFFER,"CH2=] v2:]mv",adc2,volt2);
  39.  
    printf("CH2=] v2:]mv\r\n",adc2,volt2);
  40.  
     
  41.  
    LCD_ShowString(60,170,200,16,16,BUFFER);
  42.  
    }
  43.  
    }
  1.  
    #include <drv_tm7705.h>
  2.  
    #include <drv_spi.h>
  3.  
    #include <delay.h>
  4.  
    #include <lcd.h>
  5.  
    /*
  6.  
    TM7705模块可以直接插到STM32f103战舰开发板模块的排母接口上。
  7.  
    TM7705模块 STM32F103正点原子战舰开发板
  8.  
     
  9.  
    SCK ------ PB13/SPI2_SCK
  10.  
    DOUT ------ PB14/SPI2_MISO
  11.  
    DIN ------ PB15/SPI3_MOSI
  12.  
    CS ------ PG7/NRF24L01_CS
  13.  
    DRDY ------ PG8/NRF24L01_IRQ
  14.  
    RST ------ PG6/NRF_CE
  15.  
    */
  16.  
     
  17.  
    #define TM7705_CS PGout(7) //CS片选宏定义,低电平有效
  18.  
    #define TM7705_RST PGout(6) //RST使能复位宏定义,低电平有效
  19.  
    #define TM7705_DRDY PGin(8) //DRDY,低电平时表示TM7705可读
  20.  
     
  21.  
     
  22.  
    /*================下面为芯片的驱动数据定义============================*/
  23.  
    /* 通信寄存器bit定义 */
  24.  
    enum
  25.  
    {
  26.  
    /* 寄存器选择 RS2 RS1 RS0 */
  27.  
    REG_COMM = 0x00, /* 通信寄存器 */
  28.  
    REG_SETUP = 0x10, /* 设置寄存器 */
  29.  
    REG_CLOCK = 0x20, /* 时钟寄存器 */
  30.  
    REG_DATA = 0x30, /* 数据寄存器 */
  31.  
    REG_ZERO_CH1 = 0x60, /* CH1 偏移寄存器 */
  32.  
    REG_FULL_CH1 = 0x70, /* CH1 满量程寄存器 */
  33.  
    REG_ZERO_CH2 = 0x61, /* CH2 偏移寄存器 */
  34.  
    REG_FULL_CH2 = 0x71, /* CH2 满量程寄存器 */
  35.  
     
  36.  
    /* 读写操作 */
  37.  
    WRITE = 0x00, /* 写操作 */
  38.  
    READ = 0x08, /* 读操作 */
  39.  
     
  40.  
    /* 通道 */
  41.  
    CH_1 = 0, /* AIN1 AIN1- */
  42.  
    CH_2 = 1, /* AIN2 AIN2- */
  43.  
    CH_3 = 2, /* AIN1- AIN1- */
  44.  
    CH_4 = 3 /* AIN1- AIN2- */
  45.  
    };
  46.  
     
  47.  
    /* 设置寄存器bit定义 */
  48.  
    enum
  49.  
    {
  50.  
    MD_NORMAL = (0 << 6), /* 正常模式 */
  51.  
    MD_CAL_SELF = (1 << 6), /* 自校准模式 */
  52.  
    MD_CAL_ZERO = (2 << 6), /* 校准0刻度模式 */
  53.  
    MD_CAL_FULL = (3 << 6), /* 校准满刻度模式 */
  54.  
     
  55.  
    GAIN_1 = (0 << 3), /* 增益 */
  56.  
    GAIN_2 = (1 << 3), /* 增益 */
  57.  
    GAIN_4 = (2 << 3), /* 增益 */
  58.  
    GAIN_8 = (3 << 3), /* 增益 */
  59.  
    GAIN_16 = (4 << 3), /* 增益 */
  60.  
    GAIN_32 = (5 << 3), /* 增益 */
  61.  
    GAIN_64 = (6 << 3), /* 增益 */
  62.  
    GAIN_128 = (7 << 3), /* 增益 */
  63.  
     
  64.  
    /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
  65.  
    BIPOLAR = (0 << 2), /* 双极性输入 */
  66.  
    UNIPOLAR = (1 << 2), /* 单极性输入 */
  67.  
     
  68.  
    BUF_NO = (0 << 1), /* 输入无缓冲(内部缓冲器不启用) */
  69.  
    BUF_EN = (1 << 1), /* 输入有缓冲 (启用内部缓冲器) 可处理高阻抗源 */
  70.  
     
  71.  
    FSYNC_0 = 0,
  72.  
    FSYNC_1 = 1 /* 不启用 */
  73.  
    };
  74.  
     
  75.  
    /* 时钟寄存器bit定义 */
  76.  
    enum
  77.  
    {
  78.  
    CLKDIS_0 = 0x00, /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
  79.  
    CLKDIS_1 = 0x10, /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */
  80.  
     
  81.  
    CLK_4_9152M = 0x08,
  82.  
    CLK_2_4576M = 0x00,
  83.  
    CLK_1M = 0x04,
  84.  
    CLK_2M = 0x0C,
  85.  
     
  86.  
    /*输出更新速率设置*/
  87.  
    FS_20HZ = 0X00,
  88.  
    FS_25HZ = 0x01,
  89.  
    FS_100HZ = 0x20,
  90.  
    FS_200HZ = 0x03,
  91.  
     
  92.  
    FS_50HZ = 0x04,
  93.  
    FS_60HZ = 0x05,
  94.  
    FS_250HZ = 0x06,
  95.  
    FS_500HZ = 0x07,
  96.  
     
  97.  
     
  98.  
    ZERO_0 = 0x00,
  99.  
    ZERO_1 = 0x80
  100.  
    };
  101.  
     
  102.  
    static void TM7705_ResetHard(void); //硬件复位
  103.  
    static void TM7705_SyncSPI(void);
  104.  
    static uint16_t TM7705_Read2Byte(void);
  105.  
     
  106.  
    /*====================芯片的驱动数据定义到此结束==========================*/
  107.  
     
  108.  
    void TM7705_Init(void) //初始化函数
  109.  
    {
  110.  
    uint16_t read = 0;
  111.  
     
  112.  
    /*==信号引脚初始化==*/
  113.  
    GPIO_InitTypeDef GPIO_InitStructure;
  114.  
     
  115.  
     
  116.  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE); //使能PB,G端口时钟
  117.  
     
  118.  
     
  119.  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12上拉 防止W25X的干扰
  120.  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
  121.  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  122.  
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化指定IO
  123.  
    GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉
  124.  
     
  125.  
     
  126.  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PG 7 推挽 CS
  127.  
    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
  128.  
    GPIO_SetBits(GPIOG,GPIO_Pin_7);
  129.  
     
  130.  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PG6 推挽 RST
  131.  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  132.  
    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
  133.  
    GPIO_ResetBits(GPIOG,GPIO_Pin_6 );
  134.  
     
  135.  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  136.  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PG8 输入 DRAY
  137.  
    GPIO_Init(GPIOG, &GPIO_InitStructure);
  138.  
    GPIO_ResetBits(GPIOG,GPIO_Pin_8 );
  139.  
     
  140.  
     
  141.  
     
  142.  
     
  143.  
     
  144.  
    SPI2_Init(); //初始化SPI2外设,在drv_spi.h中实现
  145.  
    SPI2_SetSpeed(SPI_BaudRatePrescaler_4);//设置为时钟
  146.  
     
  147.  
    TM7705_CS = 1; //TM7705初始化不选中
  148.  
     
  149.  
    TM7705_ResetHard(); //硬件复位
  150.  
     
  151.  
     
  152.  
    TM7705_SyncSPI(); //同步SPI接口时序
  153.  
     
  154.  
     
  155.  
     
  156.  
    /*配置时钟寄存器*/
  157.  
    TM7705_CS = 0;
  158.  
    SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_1); //先写通信寄存器,下一步写时钟寄存器
  159.  
     
  160.  
    SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ ); //刷新速率250HZ
  161.  
     
  162.  
     
  163.  
     
  164.  
    SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_2); //先写通信寄存器,下一步写时钟寄存器
  165.  
     
  166.  
    SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ ); //刷新速率250HZ
  167.  
     
  168.  
    TM7705_CS = 1;
  169.  
     
  170.  
     
  171.  
    SPI2_ReadWriteByte(REG_SETUP | WRITE |CH_1); //先写通信寄存器,下一步写设置寄存器
  172.  
     
  173.  
    SPI2_ReadWriteByte(MD_NORMAL | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0 ); //写设置寄存器正常模式,增益为1、dan极性、有缓冲、滤波器工作、
  174.  
     
  175.  
    /*每次上电进行一次自校准*/
  176.  
    TM7705_CalibSelf(1); //内部自校准
  177.  
     
  178.  
     
  179.  
    SPI2_ReadWriteByte(REG_SETUP | WRITE |CH_2); //先写通信寄存器,下一步写设置寄存器
  180.  
     
  181.  
    SPI2_ReadWriteByte(MD_NORMAL | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0 ); //写设置寄存器正常模式,增益为1、dan极性、有缓冲、滤波器工作、
  182.  
     
  183.  
     
  184.  
    TM7705_CalibSelf(2); //内部自校准
  185.  
     
  186.  
    // SPI2_ReadWriteByte(0x39);
  187.  
    // read = TM7705_Read2Byte();
  188.  
     
  189.  
     
  190.  
     
  191.  
    }
  192.  
     
  193.  
    /*===硬件复位Tm7705芯片,无出入参数===*/
  194.  
    static void TM7705_ResetHard(void) //硬件复位
  195.  
    {
  196.  
    TM7705_RST = 1;
  197.  
    delay_ms(1);
  198.  
    TM7705_RST = 0;
  199.  
    delay_ms(20);
  200.  
    TM7705_RST = 1;
  201.  
    delay_ms(1);
  202.  
    }
  203.  
     
  204.  
    /*=============================================
  205.  
    = 功能:同步TM7705芯片SPI接口时序
  206.  
    = 说明:连续发送32个1即可,不同步会发生数据错位
  207.  
    ==============================================*/
  208.  
     
  209.  
    static void TM7705_SyncSPI(void) //同步SPI接口时序
  210.  
    {
  211.  
    TM7705_CS = 0;
  212.  
    SPI2_ReadWriteByte(0xFF);//32个1
  213.  
    SPI2_ReadWriteByte(0xFF);
  214.  
    SPI2_ReadWriteByte(0xFF);
  215.  
    SPI2_ReadWriteByte(0xFF);
  216.  
     
  217.  
    TM7705_CS = 1;
  218.  
    delay_ms(1);
  219.  
     
  220.  
    }
  221.  
    /*====================================================================
  222.  
    =功能说明: 等待内部操作完成,自校准时间较长,需要等待
  223.  
    =参 数: 无
  224.  
    ======================================================================*/
  225.  
    static void TM7705_WaitDRDY(void)
  226.  
    {
  227.  
    delay_ms(40);
  228.  
     
  229.  
    while(GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_8==1)){}//待数据准备好AdDrdy=0,0代表数据准备好了。1的时候没准备好,等待
  230.  
    }
  231.  
     
  232.  
     
  233.  
     
  234.  
    /*====================================================================
  235.  
    = 功能说明: 启动自校准. 内部自动短接AIN AIN-校准0位,内部短接到Vref
  236.  
    校准满位。此函数执行过程较长,实测约 180ms
  237.  
    = 形 参: _ch : ADC通道,1或2
  238.  
    =====================================================================*/
  239.  
     
  240.  
    void TM7705_CalibSelf(uint8_t _ch)
  241.  
    {
  242.  
    if (_ch == 1)
  243.  
    {
  244.  
    /* 自校准CH1 */
  245.  
    SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_1); /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  246.  
    SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0);/* 启动自校准 *///写设置寄存器,单极性、有缓冲、增益为1、滤波器工作、自校准
  247.  
     
  248.  
    delay_ms(190);
  249.  
    TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */
  250.  
    }
  251.  
    else if (_ch == 2)
  252.  
    {
  253.  
    /* 自校准CH2 */
  254.  
    SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_2); /* 写通信寄存器,下一步是写设置寄存器,通道2 */
  255.  
    SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0); /* 启动自校准 */
  256.  
    delay_ms(190);
  257.  
    TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */
  258.  
    }
  259.  
     
  260.  
     
  261.  
    }
  262.  
     
  263.  
    /*=====================================================================
  264.  
    =功能说明:读到一个8位数据
  265.  
    =参 数:返回读到的值
  266.  
    =====================================================================*/
  267.  
    static uint8_t TM7705_ReadByte(void)
  268.  
    {
  269.  
    uint8_t read = 0;
  270.  
    TM7705_CS = 0;
  271.  
    read = SPI2_ReadWriteByte(0xFF);
  272.  
    TM7705_CS = 1;
  273.  
     
  274.  
    return read;
  275.  
    }
  276.  
     
  277.  
    /*=====================================================================
  278.  
    =功能说明:读到一个16位数据(半字)
  279.  
    =参 数:返回读到16位数据的值
  280.  
    =====================================================================*/
  281.  
    static uint16_t TM7705_Read2Byte()
  282.  
    {
  283.  
    uint16_t read = 0;
  284.  
     
  285.  
    TM7705_CS =0 ;
  286.  
    read = SPI2_ReadWriteByte(0xFF);
  287.  
    read <<=8;
  288.  
    read = SPI2_ReadWriteByte(0xFF);
  289.  
    TM7705_CS =1 ;
  290.  
     
  291.  
    return read;
  292.  
     
  293.  
    }
  294.  
     
  295.  
    /*=====================================================================
  296.  
    =功能说明:读到一个24位数据(3字节)
  297.  
    =参 数:返回读到24位数据的值
  298.  
    =====================================================================*/
  299.  
    static uint16_t TM7705_Read3Byte(void)
  300.  
    {
  301.  
    uint32_t read = 0;
  302.  
    TM7705_CS = 0;
  303.  
    read = SPI2_ReadWriteByte(0xFF);
  304.  
    read <<=8;
  305.  
    read = SPI2_ReadWriteByte(0xFF);
  306.  
    read <<=8;
  307.  
    read = SPI2_ReadWriteByte(0xFF);
  308.  
    TM7705_CS =1 ;
  309.  
     
  310.  
    return read;
  311.  
     
  312.  
    }
  313.  
     
  314.  
    /*=====================================================================
  315.  
    =功能说明:读取采样电压值
  316.  
    =参 数:返回采样值
  317.  
    =====================================================================*/
  318.  
    uint16_t TM7705_ReadAdc(uint8_t _ch)
  319.  
    {
  320.  
    uint8_t i;
  321.  
    uint16_t read = 0;
  322.  
     
  323.  
    /* 为了避免通道切换造成读数失效,读2次 */
  324.  
    for (i = 0; i < 2; i )
  325.  
    {
  326.  
    TM7705_WaitDRDY(); /* 等待DRDY口线为0 */
  327.  
     
  328.  
    if (_ch == 1)
  329.  
    {
  330.  
    SPI2_ReadWriteByte(0x38);
  331.  
     
  332.  
    }
  333.  
    else if (_ch == 2)
  334.  
    {
  335.  
     
  336.  
    SPI2_ReadWriteByte(0x39);
  337.  
     
  338.  
    }
  339.  
     
  340.  
    read = TM7705_Read2Byte();
  341.  
    }
  342.  
    return read;
  343.  
     
  344.  
     
  345.  
     
  346.  
    }
  1.  
     
  2.  
     
  3.  
    #ifndef _DRV_TM7705_H
  4.  
    #define _DRV_TM7705_H
  5.  
     
  6.  
    #include "sys.h"
  7.  
     
  8.  
    void TM7705_CalibSelf(uint8_t _ch); //启动自校准
  9.  
    void TM7705_Init(void); //初始化函数
  10.  
    uint16_t TM7705_ReadAdc(uint8_t _ch);//读值
  11.  
    #endif
  1.  
    #include "drv_spi.h"
  2.  
     
  3.  
     
  4.  
     
  5.  
    //SPI口初始化
  6.  
    //这里针是对SPI2的初始化
  7.  
     
  8.  
     
  9.  
     
  10.  
    void SPI2_Init(void)
  11.  
    {
  12.  
    GPIO_InitTypeDef GPIO_InitStructure;
  13.  
    SPI_InitTypeDef SPI_InitStructure;
  14.  
     
  15.  
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
  16.  
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
  17.  
     
  18.  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  19.  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出
  20.  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.  
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
  22.  
     
  23.  
    GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉
  24.  
     
  25.  
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  26.  
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
  27.  
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
  28.  
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
  29.  
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  30.  
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  31.  
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //定义波特率预分频的值:波特率预分频值为256
  32.  
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  33.  
    SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
  34.  
    SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  35.  
     
  36.  
    SPI_Cmd(SPI2, ENABLE); //使能SPI外设
  37.  
     
  38.  
    SPI2_ReadWriteByte(0xff);//启动传输
  39.  
     
  40.  
     
  41.  
    }
  42.  
    //SPI 速度设置函数
  43.  
    //SpeedSet:
  44.  
    //SPI_BaudRatePrescaler_2 2分频
  45.  
    //SPI_BaudRatePrescaler_8 8分频
  46.  
    //SPI_BaudRatePrescaler_16 16分频
  47.  
    //SPI_BaudRatePrescaler_256 256分频
  48.  
     
  49.  
    void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
  50.  
    {
  51.  
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//检测传递给函数的参数是否是有效的参数
  52.  
    SPI2->CR1&=0XFFC7;
  53.  
    SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度
  54.  
    SPI_Cmd(SPI2,ENABLE);
  55.  
     
  56.  
    }
  57.  
     
  58.  
    //SPIx 读写一个字节
  59.  
    //TxData:要写入的字节
  60.  
    //返回值:读取到的字节
  61.  
    u8 SPI2_ReadWriteByte(u8 TxData)
  62.  
    {
  63.  
    u8 retry=0;
  64.  
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  65.  
    {
  66.  
    retry ;
  67.  
    if(retry>200)return 0;
  68.  
    }
  69.  
    SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
  70.  
    retry=0;
  71.  
     
  72.  
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  73.  
    {
  74.  
    retry ;
  75.  
    if(retry>200)return 0;
  76.  
    }
  77.  
    return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
  78.  
    }
  1.  
    #ifndef __DRV_SPI_H
  2.  
    #define __DRV_SPI_H
  3.  
    #include "sys.h"
  4.  
     
  5.  
     
  6.  
     
  7.  
    void SPI2_Init(void); //初始化SPI口
  8.  
    void SPI2_SetSpeed(u8 SpeedSet); //设置SPI速度
  9.  
    u8 SPI2_ReadWriteByte(u8 TxData);//SPI总线读写一个字节
  10.  
     
  11.  
    #endif

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhejcgbe
系列文章
更多 icon
同类精品
更多 icon
继续加载