模拟SPI通信 获取温度传感器显示在数码管上

include

cpp 复制代码
#ifndef __SPI_H__
#define __SPI_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"

// MOSI对应的引脚输出高低电平的信号
#define  MOSI_OUTPUT_H()    do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)
 
// 对应595芯片的锁存引脚输出高低电平  nss
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)
    
// 时钟信号对应的引脚输出高低电平 sck
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)

void SPI_init(void);
/*
 * 函数功能:SPI发送数据的函数
 * 函数参数:dat : 要发送的数据
 * 函数返回值:无
 *
*/
void SPI_write(unsigned char dat);
void delay_us1(unsigned int us);
void show(int w, int d);


#endif

test

cpp 复制代码
#include "spi.h"

/* SPI4_NSS     ---->   PE11
 * SPI4_SCK     ---->   PE12
 * SPI4_MOSI    ---->   PE14
 * SPI4_MISO    ---->   PE13
 * */

/* 数码管的编码, 先发送低位,在发送高位
 * A B C D E F G DP
 * 1 1 1 1 1 1 0 0    0xFC   0
 * 0 1 1 0 0 0 0 0    0x60   1
 * 1 1 0 1 1 0 1 0    0xDA   2
 * 1 1 1 1 0 0 1 0    0xF2   3
 * 0 1 1 0 0 1 1 0    0x66   4
 * 1 0 1 1 0 1 1 0    0xB6   5 
 * 1 0 1 1 1 1 1 0    0xBE   6
 * 1 1 1 0 0 0 0 0    0xE0   7
 * 1 1 1 1 1 1 1 0    0xFE   8
 * 1 1 1 1 0 1 1 0    0xF6   9
 * */

//延时函数
void delay_us1(unsigned int us)
{
    int i, j;
    for (i = 0; i < us; i++)
        for (j = 0; j < 1; j++)
            ;
}

void SPI_init(void)
{
    //使能GPIOE时钟
    RCC->MP_AHB4ENSETR |= (0x1 << 4);
    // MOSI    PE14 输出
    GPIOE->MODER &= (~(0x3 << 28));
    GPIOE->MODER |= (0x1 << 28);
    GPIOE->OTYPER &= (~(0x1 << 14));
    GPIOE->OSPEEDR &= (~(0x3 << 28));
    //  GPIOE->OSPEEDR |= (0x2 << 28);
    GPIOE->PUPDR &= (~(0x3 << 28));
    // MISO    PE13  输入
    GPIOE->MODER &= (~(0x3 << 26));
    GPIOE->OSPEEDR &= (~(0x3 << 26));
    //  GPIOE->OSPEEDR |= (0x2 << 26);
    GPIOE->PUPDR &= (~(0x3 << 26));
    // SCK     PE12 输出
    GPIOE->MODER &= (~(0x3 << 24));
    GPIOE->MODER |= (0x1 << 24);
    GPIOE->OTYPER &= (~(0x1 << 12));
    GPIOE->OSPEEDR &= (~(0x3 << 24));
    //  GPIOE->OSPEEDR |= (0x2 << 24);
    GPIOE->PUPDR &= (~(0x3 << 24));
    // NSS     PE11  输出
    GPIOE->MODER &= (~(0x3 << 22));
    GPIOE->MODER |= (0x1 << 22);
    GPIOE->OTYPER &= (~(0x1 << 11));
    GPIOE->OSPEEDR &= (~(0x3 << 22));
    //  GPIOE->OSPEEDR |= (0x2 << 22);
    GPIOE->PUPDR &= (~(0x3 << 22));
    NSS_OUTPUT_L(); // 595芯片的锁存引脚拉低
    SCK_OUTPUT_L(); // SPI的时钟线拉低
}

void SPI_write(unsigned char dat)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {

        if (dat & 0x01)
        {
            MOSI_OUTPUT_H(); // MOSI线写高
        }
        else
        {
            MOSI_OUTPUT_L(); // MOSI线写低
        }
        dat >>= 1;
        // 时钟线从低电平到高电平的变化时,MOSI数据线上的数据
        // 被写到595芯片的移位寄存器中
        SCK_OUTPUT_L(); // SCK拉低
        delay_us1(10);
        SCK_OUTPUT_H(); // SCK拉高
        delay_us1(10);
    }
    //NSS_OUTPUT_L();
    //NSS_OUTPUT_H();
}

//显示  w 位  d 段
int num[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0x3E, 0xE0, 0xFE, 0xF6};
void show(int w,int d)
{

    w=0x1<<(8-w);
    
    SPI_init();

    SPI_write(w);      // 发送数码管的位
    SPI_write(num[d]); // 发送数码管的段
    NSS_OUTPUT_L();    //数据下沉到所存寄存器 NSS上升沿
    delay_us1(1);
    NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
                    // 将移位寄存器中的数据锁存到锁存寄存器中
 
}

main

cpp 复制代码
#include "spi.h"



#include "si7006.h"



int main()

{

  SPI_init();

  si7006_init();



  short tem;

  unsigned short hum;



  while (1)

  {

    hum = si7006_read_hum_data(0x40, 0xE5);

    tem = si7006_read_temp_data(0x40, 0xE3);



    tem = 175.72 * tem / 65536 - 46.85;

    hum = 125 * hum / 65536 - 6;

    printf("%d \n %d \n", tem, hum);



    unsigned int i = 1;



    for (i = 1; i < 1000; i++)

    {

      show(1, tem / 10);

      show(2, tem % 10);



      show(3, hum / 10);

      show(4, hum % 10);

    }

    show(0,0);

  }



  return 0;

}
相关推荐
sramdram5 小时前
基于32位微控制器的FOC汽车水泵方案
单片机·嵌入式硬件·汽车·微控制器·32位微控制器
开发笔记-阿牛8 小时前
解析一款有意思的产品||CK6159A语音芯片设计的儿童专注力训练机-舒尔特玩具
stm32·单片机·嵌入式硬件·音频
残影飞雪9 小时前
ESP32-C5下载烧录固件失败报错的原因
单片机·嵌入式硬件
搞全栈小苏10 小时前
SIMetrix_simplis8.4安装教程——附安装包
stm32·单片机·嵌入式硬件·电力电子
qq_5739678211 小时前
STM32控制器
stm32·单片机·嵌入式硬件
某林21212 小时前
履带小车底盘stm32F103RCT6开发
人工智能·stm32·单片机·嵌入式硬件·架构·人机交互·ros2
sramdram12 小时前
低功耗MCU微控制器在动态血糖仪(CGM)中的应用方案
单片机·嵌入式硬件·mcu·mcu微控制器
Dlrb121112 小时前
ARM--IMX6ULL的SDK学习,BSP开发工程管理,以及链接脚本与Makefile的编写
单片机·嵌入式硬件·arm·sdk·链接脚本·i.mx6ull·cortex-a7
李永奉13 小时前
杰理可视化SDK开发-配置ANC主动降噪功能模块教程
单片机·嵌入式硬件·物联网
云泽80813 小时前
嵌入式环境搭建(一):Keil MDK5 安装流程及 DFP 器件包配置实战
嵌入式硬件·keil5·keil mdk5·dfp器件包配置