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 实验效果

相关推荐
en.en..2 小时前
Linux 孤儿进程与僵尸进程
linux·运维·服务器
2501_941875283 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj4 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp6 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob2336 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒7 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb7 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
T1mzhou7 小时前
ARM64 Linux 6.10内核启动流程7-ioremap和readl writel
linux·服务器·c语言
Keven_118 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
bwz999@88.com8 小时前
Ubuntu Server 24.04 设置中文
linux·运维·ubuntu