当前位置: 首页 > news >正文

C语言 Cortex-A7核 SPI 实验

1 实验目的

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

2、数码管不同的值1234

2 代码

include/spi.h

#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

#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

#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 0for(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 //123for(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 实验效果


 

http://www.lryc.cn/news/177277.html

相关文章:

  • Spring工具类--ReflectionUtils的使用
  • zemax西德莫尔目镜
  • C++ 拷贝构造函数
  • 怎么使用 Flink 向 Apache Doris 表中写 Bitmap 类型的数据
  • LeetCode 四数相加II 哈希
  • python(自4) xpath下载 lxml安装 lxml语法 使用方式
  • 05-Zookeeper典型使用场景实战
  • stl格式-3D三角形
  • 基于微信小程序的高校暑期社会实践小程序设计与实现(源码+lw+部署文档+讲解等)
  • ARM-day2
  • macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址
  • HarmonyOS开发:封装一个便捷的Log工具类
  • 第十章_祖冲之_圆周率
  • FVM管理Flutter 环境
  • vue | 样式隔离scoped的原理 样式穿透deep的原理
  • UML,集合框架
  • 如何快速轻松自动添加微信好友?
  • MySQL高级语句(第一部分)
  • Perl区分文件换行符类型
  • 数据备份文件生成--根据表名生成对应的sql语句文件
  • 进程同步与互斥
  • mysql workbench常用操作
  • 【操作】国标GB28181视频监控EasyGBS平台更新设备信息时间间隔
  • TensorFlow入门(八、TensorBoard可视化工具的应用)
  • 升级targetSdkVersion至33(以及迁移至Androidx)
  • python3.11版本pip install ddddocr调用时报错got an unexpected keyword argument ‘det‘ 解决
  • 代理IP与Socks5代理:跨界电商之安全防护与智能数据引擎
  • 如何评估一个HR是否专业?看这些标准
  • WordPress主题开发( 八)之—— 模板循环详细用法
  • QT : 完成绘制时钟