[STM32F1] stm 软件模拟spi的程序问题

[复制链接]
1775|10
 楼主| 一抹笑zZ 发表于 2019-1-29 13:22 | 显示全部楼层 |阅读模式
本帖最后由 一抹笑zZ 于 2019-1-29 13:48 编辑

想读adc  cs5532的数值,自己写了spi的读写程序,但是一直读不出数据来,有没有大神能帮我看下程序上有没有问题
  1. <font size="4">void SPI_Write_Byte(u8 dat)   //采样在第一个边沿,数据发送在第二个边沿
  2. {
  3.                 u8 i,temp;

  4.                 SCK_H;
  5.                 NSS_L;
  6.                 delay_us(2);
  7.                 for(i=0;i<8;i++)
  8.                 {
  9.                                 SCK_H;
  10.                                 temp=dat&0x80;
  11.                                 
  12.                                 if(temp==0x80)
  13.                                 {
  14.                                         MOSI_H;
  15.                                 }
  16.                                 else
  17.                                 {
  18.                                         MOSI_L;
  19.                                 }
  20.                                 dat=dat<<1;
  21.                                 delay_us(2);
  22.                                 SCK_L;        
  23.                                 delay_us(2);                                
  24.                 }        
  25.                                 SCK_L;

  26. }


  27. u8 SPI_Read_Byte()
  28. {
  29.         u8 i,temp;
  30.         NSS_L;
  31.         SCK_L;
  32.         delay_us(2);
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 delay_us(2);
  36.                 SCK_H;
  37.                 delay_us(1);
  38.                 if(MISO==1)
  39.                 {
  40.                         temp=temp|0x01;
  41.                 }
  42.                 else
  43.                 {
  44.                         temp=temp&0xfe;
  45.                 }
  46.                 delay_us(2);
  47.                 SCK_L;
  48.                 temp<<=1;                                       
  49.         }
  50.         SCK_L;
  51.         
  52.         return temp;        
  53.                
  54. }</font>




 楼主| 一抹笑zZ 发表于 2019-1-29 15:36 | 显示全部楼层
cs5532配置程序用的是别人现成的,应该没什么问题,这部分是我自己写的,不知道是不是时序上考虑的不对,用示波器看Cs5532的SDO口没有输出的,数据没有被读出来
玛尼玛尼哄 发表于 2019-1-29 17:06 | 显示全部楼层
  1. #include "CS5532.h"
  2. #include "CS5532_SPI.h"

  3. int main(void)
  4. {
  5. static u32 temp=0,sum=0,sum1=0,sum2=0;
  6.     SPI_Initial();//主机模式,速度加倍 配置函数,省略没贴
  7.   CS5532_Initial();
  8.   while(1)
  9.           {
  10.             sum=read_adc();//连续转换模式
  11.                     
  12.   }
  13. void CS5532_Reset(void)//串口复位
  14.         {
  15.         u8 i=0;
  16.                 for(i=0;i<31;i++)
  17.                         {
  18.                          SPI_WriteByte(0xff);
  19.                         }
  20.                 SPI_WriteByte(0xfe);
  21.                
  22.         }


  23.   void CS5532_Config()
  24.           {
  25.              CS5532_CS(0);
  26. //写配置寄存器0x00080000, FRS=1//输出字速率及相应的滤波特性乘以系数5/6  
  27.            SPI_WriteByte(0x03);
  28.       SPI_WriteByte(0x00);
  29.      SPI_WriteByte(0x08);
  30.     SPI_WriteByte(0x00);
  31.     SPI_WriteByte(0x00);
  32.       
  33.            //写通道设置寄存器
  34.          SPI_WriteByte(0x05);
  35.            /*ADC64X*/
  36.            SPI_WriteByte(0X31);
  37.            SPI_WriteByte(0X80);
  38.            /*ADC15hz*/
  39.                    SPI_WriteByte(0x31);
  40.            SPI_WriteByte(0x80);
  41.          
  42.            SPI_WriteByte(0xc0);//执行转换命令 向CS5532中写入启动A/D连续转换   (8位串口命令)
  43.           }
  44.   
  45. /******************************
  46. func: CS5532 初始化
  47. input:   none
  48. output: none
  49. *******************************/
  50. void CS5532_Initial()
  51. {

  52.    u8 i=0;
  53.    u32 tmp=0,reg1=0,reg2=0,reg3=0,reg0=0;

  54.   CS5532_CS(0);
  55.   while(tmp!=0x30000000)
  56.           {
  57.   CS5532_Reset();
  58.   /*//向命令寄存器中写入0x03.表明调用配置寄存器
  59.                  // 0x22000000  写入CS5532复位命令   RS=1   激活一个复位周期,复位后自动归0
  60.      // VRS=1   电压参考选择 1        V<=Vref<=2.5V */
  61. SPI_WriteByte(0x03);
  62. SPI_WriteByte(0x22);
  63. SPI_WriteByte(0x00);
  64. SPI_WriteByte(0x00);
  65. SPI_WriteByte(0x00);

  66. /*/读取配置寄存器内容    1.先通过write_CS5532_byte(0x0b)这个命令,读配置寄存器
  67.                                                                  //2.再从配置寄存器读取内容传到MCU. */
  68. SPI_WriteByte(0x0b);


  69.   reg0=SPI_ReadByte();
  70.   reg1=SPI_ReadByte();

  71.    reg2=SPI_ReadByte();

  72.    reg3=SPI_ReadByte();

  73.    tmp=reg0<<24|reg1<<16|reg2<<8|reg3;
  74.           }

  75.   CS5532_Config();

  76. }

  77. void CS5532_Delay(uint length)
  78. {
  79.   while(length>0)
  80.           length--;
  81. }

  82. u32 read_adc()
  83. {
  84. u8 i;
  85. u32 temp0=0,temp1=0,temp2=0,temp3=0;
  86. u32 reg=0;
  87. CS5532_CS(0);
  88. for(i=0;i<8;i++)
  89.         {
  90.           SPI_WriteByte(0xff);
  91.         }

  92.     temp0=SPI_ReadByte();
  93.          temp1=SPI_ReadByte();
  94.           temp2=SPI_ReadByte();
  95.            temp3=SPI_ReadByte();
  96.          

  97.            reg=temp0<<24|temp1<<16|temp2<<8|temp3;
  98.          //  CS5532_CS(1);

  99.            return reg>>11;
  100.            
  101.         
  102. }

  103. u8 SPI_ReadByte(void)//
  104.         

  105. {
  106.   return (SPI_WriteByte(0xff));
  107. }


  108. u8 SPI_WriteByte(u8 TxData)
  109. {
  110.   u8 RxData=0;

  111.   while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET); //                                                   
  112.   SPI_I2S_SendData(SPI1,TxData);

  113.    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);

  114.    RxData=SPI_I2S_ReceiveData(SPI1);

  115.     return RxData;
  116. }  
玛尼玛尼哄 发表于 2019-1-29 17:06 | 显示全部楼层
网上看到的。
wanduzi 发表于 2019-1-29 18:41 | 显示全部楼层
按手册的时序用IO搞。
mmuuss586 发表于 2019-1-29 20:38 | 显示全部楼层
用示波器看下时序,哪里出的问题
 楼主| 一抹笑zZ 发表于 2019-1-30 13:03 | 显示全部楼层
Ketose 发表于 2019-1-30 14:58 | 显示全部楼层
ST的单片机没有SPI吗?
sky.sun.zz 发表于 2019-1-30 15:12 | 显示全部楼层
读数据的时候MISO引脚貌似没有配置成输入状态,如何读出数据?
磨砂 发表于 2019-3-1 12:53 | 显示全部楼层
卡卡波形看看哪里不对
晓伍 发表于 2019-3-1 17:24 | 显示全部楼层
这样看代码太慢 直接上示波器一看就知道哪里的问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

160

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部