C语言 Cortex-A7核 SPI 实验

1 实验目的

1、数码管显示相同的值0000 1111 2222 .... 9999

2、数码管不同的值1234

2 代码

include/spi.h

cs 复制代码
#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芯片的锁存引脚输出高低电平                                     
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)       
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)    
                                                                         
// 时钟信号对应的引脚输出高低电平                                        
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)       
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)    
                                                                         
/*                                                                       
 * 函数功能: SPI初始化函数,推挽输出,高速,禁止上拉和下拉              
 * 函数参数:无                                                          
 * 函数返回值:无                                                        
*/                                                                       
void SPI_init(void);                                                     
/*                                                                       
 * 函数功能:SPI发送数据的函数                                           
 * 函数参数:dat : 要发送的数据                                          
 * 函数返回值:无                                                        
 *                                                                       
*/                                                                       
void SPI_write(unsigned char dat);                                       
                                                                         
                                                                         
#endif  // __SPI_H__                                                     

src/spi.c

cs 复制代码
#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)                                            
{                                                              
    RCC->MP_AHB4ENSETR |= (0x1 << 4);                          
    // MOSI    PE14                                            
    GPIOE->MODER &= (~(0x3 << 28));                            
    GPIOE->MODER |= (0x1 << 28);                               
    GPIOE->OTYPER &= (~(0x1 << 14));                           
    GPIOE->OSPEEDR &= (~(0x3 << 28));                          
    GPIOE->PUPDR &= (~(0x3 << 28));                            
    // MISO    PE13                                            
    GPIOE->MODER &= (~(0x3 << 26));                            
    GPIOE->OSPEEDR &= (~(0x3 << 26));                          
    GPIOE->PUPDR &= (~(0x3 << 26));                            
    // SCK     PE12                                            
    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));                            
    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(); //向数据线上写入高电平            
        else                                                   
            MOSI_OUTPUT_L(); //向数据线上写入低电平            
        //移位                                                 
        dat >>= 1;                                             
        //时钟信号从低电平到高电平变化                         
        SCK_OUTPUT_L();                                        
        delay_us1(10);                                         
        SCK_OUTPUT_H();                                        
        delay_us1(10);                                         
    }                                                          
}                                                              

main.c

cs 复制代码
#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++);
}

int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int main()
{
    unsigned char i;
    SPI_init(); //SPI初始化
    while(1)
    {
#if 0
        for(i=0;i<10;i++)
        {
            SPI_write(0xF0);//先控制 位
            SPI_write(num[i]);//再控制 段
            //锁存时钟从低电平到高电平变化
            NSS_OUTPUT_L();
            delay_ms(1);
            NSS_OUTPUT_H();
            delay_ms(1000);
        }
#else //123
        for(i=0;i<4;i++)
        {
            SPI_write(0x80 >> i);//位
            SPI_write(num[i+1]);//段
            //锁存时钟从低电平到高电平变化
            NSS_OUTPUT_L();
            delay_ms(1);
            NSS_OUTPUT_H();
            delay_ms(1000);
        }
#endif
    }
    return 0;
}                                                                         

3 实验效果

相关推荐
杨荧16 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
颇有几分姿色17 分钟前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
白子寰23 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT35 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。37 分钟前
c++多线程
java·开发语言
小政爱学习!39 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
AndyFrank1 小时前
mac crontab 不能使用问题简记
linux·运维·macos
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
筱源源1 小时前
Kafka-linux环境部署
linux·kafka