本帖最后由 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):
程序已经调试成功,最后我发现是我示波器没有设置好,导致没有时钟信号、数据信号。现在可一了。谢谢各位
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>