首页 > 其他分享 >模拟SPI 4种模式

模拟SPI 4种模式

时间:2023-03-01 13:22:05浏览次数:31  
标签:write MOSI uint8 模式 dat SPI 模拟

https://blog.csdn.net/u012846795/article/details/123861413

  1 /* CPOL = 0, CPHA = 0, MSB first */
  2 uint8_t SOFT_SPI_RW_MODE0( uint8_t write_dat )
  3 {
  4     uint8_t i, read_dat;
  5     for( i = 0; i < 8; i++ )
  6     {
  7         if( write_dat & 0x80 )
  8             MOSI_H;  
  9         else                    
 10             MOSI_L;  
 11         write_dat <<= 1;
 12         delay_us(1);  
 13         SCK_H; 
 14         read_dat <<= 1;  
 15         if( MISO ) 
 16             read_dat++; 
 17     delay_us(1);
 18         SCK_L; 
 19         __nop();
 20     }
 21   
 22     return read_dat;
 23 }
 24  
 25  
 26 /* CPOL=0,CPHA=1, MSB first */
 27 uint8_t SOFT_SPI_RW_MODE1(uint8_t byte) 
 28 {
 29     uint8_t i,Temp=0;
 30  
 31   for(i=0;i<8;i++)     // 循环8次
 32   {
 33     SCK_H;     //拉高时钟
 34     if(byte&0x80)
 35         {
 36       MOSI_H;  //若最到位为高,则输出高
 37         }
 38     else      
 39     {
 40       MOSI_L;   //若最到位为低,则输出低
 41     }
 42     byte <<= 1;     // 低一位移位到最高位
 43     delay_us(1);
 44     SCK_L;     //拉低时钟
 45     Temp <<= 1;     //数据左移
 46  
 47     if(MISO)
 48       Temp++;     //若从从机接收到高电平,数据自加一
 49     delay_us(1);
 50  
 51   }
 52   return (Temp);     //返回数据
 53 }
 54  
 55 /* CPOL=1,CPHA=0, MSB first */
 56 uint8_t SOFT_SPI_RW_MODE2(uint8_t byte) 
 57 {
 58     uint8_t i,Temp=0;
 59  
 60   for(i=0;i<8;i++)     // 循环8次
 61   {
 62     if(byte&0x80)
 63         {
 64       MOSI_H;  //若最到位为高,则输出高
 65         }
 66     else      
 67     {
 68       MOSI_L;   //若最到位为低,则输出低
 69     }
 70     byte <<= 1;     // 低一位移位到最高位
 71     delay_us(1);
 72     SCK_L;     //拉低时钟
 73     Temp <<= 1;     //数据左移
 74  
 75     if(MISO)
 76       Temp++;     //若从从机接收到高电平,数据自加一
 77     delay_us(1);
 78     SCK_H;     //拉高时钟
 79     
 80   }
 81   return (Temp);     //返回数据
 82 }
 83  
 84  
 85 /* CPOL = 1, CPHA = 1, MSB first */
 86 uint8_t SOFT_SPI_RW_MODE3( uint8_t write_dat )
 87 {
 88     uint8_t i, read_dat;
 89     for( i = 0; i < 8; i++ )
 90     {
 91     SCK_L; 
 92         if( write_dat & 0x80 )
 93             MOSI_H;  
 94         else                    
 95             MOSI_L;  
 96         write_dat <<= 1;
 97         delay_us(1);  
 98         SCK_H; 
 99         read_dat <<= 1;  
100         if( MISO ) 
101             read_dat++; 
102     delay_us(1);
103         __nop();
104     }
105     return read_dat;
106 }

 

标签:write,MOSI,uint8,模式,dat,SPI,模拟
From: https://www.cnblogs.com/better-day/p/17167819.html

相关文章

  • k8s通过sidecar模式收集pod的容器日志至ELK
    架构:已完成的部署1、ES集群及kibana部署​​https://blog.51cto.com/yht1990/6080981​​2、kafaka+zookeeper集群​​https://blog.51cto.com/yht1990/6081518​​准备side......
  • 23种设计模式一:单例模式
    1、说明1.1定义单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的......
  • LVS负载均衡DR模式
    拓扑图:推荐步骤:Firewalld防火墙配置IP地址,LVS调度器配置IP地址修改内核参数,配置web服务器IP地址,配置NFS共享存储服务器IP地址,客户端配置IP地址搭建共享存储配置允许web......
  • pat乙级:模拟链表问题(汇总,包含所有pat中链表题目分析)
    更新:优化文章结构,增加了部分内容如(1110区块反转)和自己代码和他人代码分析。看完你就懂了转载请注明出处和链接地址:(https://www.cnblogs.com/ahappyfool/p/17156470.htm......
  • SPINAND UBI 离线烧录 开发指南
    SPINANDUBI离线烧录开发指南1概述编写目的:介绍SunxiSPINand烧写时的数据布局2名词解释词义UBIunsortedblockimagePEBphysicaleraseblock......
  • SPINAND UBI 离线烧录 开发指南
    SPINANDUBI离线烧录开发指南1概述编写目的:介绍SunxiSPINand烧写时的数据布局2名词解释词义UBIunsortedblockimagePEBphysicaleraseblock......
  • go options 模式
    ...函数式选项模式的使用场景有哪些呢:我们一般用来配置一些基础的服务配置,比如MySQL,Redis,Kafka的配置,很多可选参数,可以方便动态灵活的配置想要配置的参数。https://zhuan......
  • 20-责任链模式
    20-责任链模式概念责任链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连城一条链,并沿着这条链传......
  • 【算法设计-模拟】日期问题
    目录1.几月几号是一年中的第几天?2.一年中的第几天是几月几号?3.给定日期,求加上x天后的日期4.两个日期相差了多少天?5.给定一个日期的星期,求另一个日期是星期几1.几月......
  • 设计模式&业务场景
    目录单例工厂观察者模板方法责任链策略单例工厂观察者模板方法责任链策略......