OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 155|回复: 1

大佬们看看我的硬件spi哪里错了,找了一天了

[复制链接]

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2024-12-9
在线时间
2 小时
发表于 2024-12-22 16:40:38 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 墨痕ink 于 2024-12-22 16:42 编辑

如题,板子是stm32f407,用示波器看了时钟和信号都有输出,就是不亮
  1. void SPI2_Init(void)
  2. {
  3. u16 tempreg=0;
  4. RCC->AHB1ENR|=1<<1; //使能 PORTB 时钟
  5. RCC->AHB1ENR|=1<<3; //使能 PORTD 时钟
  6. RCC->APB1ENR|=1<<14; //SPI2 时钟使能

  7. <blockquote>GPIO_Set(GPIOB,PIN12,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB12输出
复制代码
这是初始化的,换成软件spi可用

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2024-12-9
在线时间
2 小时
 楼主| 发表于 2024-12-22 16:43:54 | 显示全部楼层
显示不全
void SPI2_Init(void)
{
u16 tempreg=0;
RCC->AHB1ENR|=1<<1; //使能 PORTB 时钟
RCC->AHB1ENR|=1<<3; //使能 PORTD 时钟
RCC->APB1ENR|=1<<14; //SPI2 时钟使能

//GPIO_Set(GPIOB,PIN12|PIN13|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB13 15 输出
//GPIO_Set(GPIOD,PIN1|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PD1 15 输出

GPIO_Set(GPIOB,PIN12,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB12输出
GPIO_Set(GPIOB,PIN13|PIN15,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB13 15 输出
GPIO_Set(GPIOD,PIN1|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PD1 15 输出
GPIO_AF_Set(GPIOB,13,5);        //PB13,AF5
GPIO_AF_Set(GPIOB,15,5);        //PB15,AF5
//这里只针对 SPI 口初始化
RCC->APB1RSTR|=1<<14; //复位 SPI2
RCC->APB1RSTR&=~(1<<14);//停止复位 SPI2
tempreg&=~(1<<10); //全双工模式
tempreg&=~(1<<15); //单向双线通信数据模式
tempreg|=1<<9; //软件 nss 管理
tempreg|=1<<8;
tempreg|=1<<2; //SPI 主机
tempreg&=~(1<<11); //8 位数据格式
tempreg&=~(1<<1); //空闲模式下 SCK 为 0 CPOL=0
tempreg|=~(1<<0); //数据采样从第 1 个时间边沿开始,CPHA=0
//对 SPI2 属于 APB1 的外设.时钟频率最大为 42Mhz 频率.
tempreg&=~(1<<3); //Fsck=Fpclk1/4
tempreg&=~(1<<7); //MSB First
SPI2->CR1=tempreg; //设置 CR1
SPI2->I2SCFGR&=~(1<<11);//选择 SPI 模式
SPI2->CRCPR=7;
SPI2->CR1|=1<<6;
LCD_Writ_Bus(0x0000);//启动传输
PBout(12)=1;
PBout(13)=1;
PBout(15)=1;
PDout(1)=1;
PDout(15)=1;
}


void LCD_Writ_Bus(u8 dat)
{
        while((SPI2->SR&1<<1)==0); //等待发送区空
        SPI2->DR=dat; //发送一个 byte
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表