SPI驱动外接设置求助

2019-10-11 16:20发布

本帖最后由 yjk114 于 2017-3-14 09:28 编辑

如题,我现在用SPI1驱动外接口TLC5618,但是我设置好SPI1后,时钟信号、MOSI口一直没有信号输出(用示波器检测不到脉冲)。我刚学习这一块,琢磨了三个星期没有找到问题,希望各位指点下,谢谢!
对于该程序,我只需要SPI1发送16位数据,而不需要接受,用PB7作为片选信号。具体的SPI程序设置如下:
#include "spi.h"

   void SPI_Init()
  {
                RCC->APB2ENR|=1<<2;        //设置PA时钟
                RCC->APB2ENR|=1<<12;     //设置SPI1时钟
                RCC->APB2ENR|=1<<3;      //设置PB时钟
                //SPI初始化设置
                GPIOA->CRL&=0X0F0FFFFF;    //清除PA57位。
                GPIOA->CRL|=0XB0B00000;    //GPIOA.5/7复用
                GPIOA->ODR|=0X5<<5;          //GPIOA.5/7 上拉

                GPIOB->CRL&=0X0FFFFFFF;     //PB.7位清除
                GPIOB->CRL|=0X30000000;      //PB.7位推完输出
                GPIOB->ODR|=1<<7;            //拉高
               
                //spi1的CR寄存器操作
                SPI1->CR1|=0<<15;           //双线双向
                SPI1->CR1|=1<<14;          //发送模式
                SPI1->CR1|=0<<10;              //全双工
                SPI1->CR1|=1<<9;               //软件管理
                SPI1->CR1|=1<<8;               //
               
                SPI1->CR1|=1<<2;               //mosi主设备模式
                SPI1->CR1|=1<<11;              //16位数据
                SPI1->CR1|=1<<1;               //sck空闲状态保持1
                SPI1->CR1|=0<<0;               //下降沿采样
               
                SPI1->CR1|=1<<3;
                SPI1->CR1|=1<<4;
                SPI1->CR1|=1<<5;               //设置256分频
                SPI1->CR1|=0<<7;               //MBS高位发送
                SPI1->CR1|=1<<6;               //使能spi1
  }
        
u16 SPI1_ReadWriteByte(u16 TxData)
{               
        u16 retry=0;                                 
        while((SPI1->SR&1<<1)==0)
        {
                retry++;
                if(retry>0XFFFE)return 0;
        }                          
        SPI1->DR=TxData;                  
        retry=0;
}


主程序:当检测到按下按钮时并放开按钮时,片选拉低,延时发送数据,延时,片选拉高,然后闪灯。
#include "sys.h"         
#include "delay.h"        
#include "led.h"
#include "key.h"
#include "spi.h"

int main(void)
{               
  u16 retry;        
        Stm32_Clock_Init(9);      
        delay_init(72);                  
        LED_Init();                          
        KEY_Init();
        SPI_Init();
        while(1)
        {
                if(KEY0==0)
                {               
                  delay_ms(10);
                  if(KEY0==0)
      {                  
                          LED0=0;
                   delay_ms(100);                        
                        }        
                        if(KEY0==1)      //按键放开
                  {
                         LED0=1;          //LED亮
                         CS0=0;           //片选拉低
                         delay_ms(50);  //延时
                         SPI1_ReadWriteByte(0X8100);   //发送数据
                         delay_ms(50);   //延时
                         CS0=1;            //片选拉高
                         LED0=0;   
                        delay_ms(300);
                         LED0=1;
                         delay_ms(300);   //闪灯
                        }
                }
        }         
}



补充内容 (2017-3-22 12:05):
程序已经调试成功,最后我发现是我示波器没有设置好,导致没有时钟信号、数据信号。现在可一了。谢谢各位
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。