include
#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
#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
#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;
}