main.c
#include "spi.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
//保存0-9编码的数组
int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};
int main(void)
{
unsigned char i,j;
SPI_init();
while(1)
{
for ( j = 0; j<2000; j++)
{
for(i = 0; i < 10; i++)
{
SPI_write(0x80); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(10);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
SPI_write(0x40); // 发送数码管的位
SPI_write(num[i]+1); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(10);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
SPI_write(0x20); // 发送数码管的位
SPI_write(num[i]+2); // 发送数码管的段
NSS_OUTPUT_L();
delay_ ms(10);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
SPI_write(0x10); // 发送数码管的位
SPI_write(num[i]+3); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(10);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
}
}
}
return 0;
}
spi.c
#include "spi.h"
void delay_us1(unsigned int us)
{
int i,j;
for ( i = 0; i < us; i++)
{
for ( j = 0; j < us; j++);
}
}
void SPI_init(void)
{
//1.使能GPIOE时钟
RCC->MP_AHB4ENSETR |= (0x1 << 4);
//2.MOSI管脚PE14 设置其输入的属性
GPIOE->MODER &= (~(0x3 << 28));
GPIOE->MODER |= (0x1 << 28);
GPIOE->OTYPER &= (~(0x1 << 14));
GPIOE ->OSPEEDR &= (~(0X3 << 28));
GPIOE ->PUPDR &= (~(0x3 << 28));
//PE13 MISO
GPIOE->MODER &= (~(0x3 << 24));
GPIOE->MODER |= (0x1 << 24);
GPIOE->OTYPER &= (~(0x1 << 12));
GPIOE ->OSPEEDR &= (~(0X3 << 24));
GPIOE ->PUPDR &= (~(0x3 << 24));
//NSS PE11
GPIOE->MODER &= (~(0x3 << 22));
GPIOE->MODER |= (0x1 << 22);
GPIOE->OTYPER &= (~(0x1 << 11));
GPIOE ->OSPEEDR &= (~(0X3 << 22));
GPIOE ->PUPDR &= (~(0x3 << 22));
}
void SPI_write(unsigned char dat)
{
unsigned int i;
for(i=0;i<8;i++)
{
if (dat&0x01)
{
/* 输出高电平*/
MOSI_OUTPUT_H();
}
else
{
/* 输出低电平 */
MOSI_OUTPUT_L();
}
dat >>= 1;
//产生上升沿
//时钟线从低电平到高电平的变化时,MOSI数据线上的数据
//被写到595芯片的移位寄存器中
SCK_OUTPUT_L(); //SCK拉低
delay_us1(20);
SCK_OUTPUT_H(); //SCK拉高
delay_us1(20);
}
}