OpenEdv-开源电子网

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

STM32F405单片机SPI2口通信的问题

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
发表于 2016-1-5 10:20:35 | 显示全部楼层 |阅读模式
请问有人用过STM32F405RGTX芯片的GPIOB12~15作为SPI通讯的吗?
项目中用这四个口分别作为四线SPI的CS,SCK,MISO和MOSI,程序也是参见开发板SPI例程中的例子改写的,其中:
spi.c:
void SPI2_Init(void)
{  
u16 tempreg=0;
RCC->AHB1ENR|=1<<0;         
//RCC->APB2ENR|=1<<12;    //SPI1
--------->  RCC->APB1ENR|=1<<14;    //SPI2
//GPIO_Set(GPIOB,0x7<<3,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3~5
//GPIO_AF_Set(GPIOB,3,5); //PB3,AF5
  //GPIO_AF_Set(GPIOB,4,5); //PB4,AF5
  //GPIO_AF_Set(GPIOB,5,5); //PB5,AF5
------->GPIO_Set(GPIOB,0x7<<13,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB13~15
------->GPIO_AF_Set(GPIOB,13,5); //PB13,AF5
-------> GPIO_AF_Set(GPIOB,14,5); //PB14,AF5
-------> GPIO_AF_Set(GPIOB,15,5); //PB15,AF5

//RCC->APB2RSTR|=1<<12; //
//RCC->APB2RSTR&=~(1<<12);//
-------> RCC->APB1RSTR|=1<<14; //
------>RCC->APB1RSTR&=~(1<<14);//
tempreg|=0<<10;   //
tempreg|=1<<9;   //
tempreg|=1<<8;   
tempreg|=1<<2;   //
tempreg|=0<<11;   //
tempreg|=1<<1;   //
tempreg|=1<<0;   //  
  //
tempreg|=7<<3;   //Fsck=Fpclk1/256
tempreg|=0<<7;   //MSB First  
tempreg|=1<<6;   //
//SPI1->CR1=tempreg;   //
//SPI1>I2SCFGR&=~(1<<11);//
//SPI1_ReadWriteByte(0xff);//
-------> SPI2->CR1=tempreg;   //
-------> SPI2->I2SCFGR&=~(1<<11);//
-------> SPI2_ReadWriteByte(0xff);//
}   

/*

void SPI1_SetSpeed(u8 SpeedSet)
{
SpeedSet&=0X07;  
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SpeedSet<<3;
SPI1->CR1|=1<<6;  
} */
void SPI2_SetSpeed(u8 SpeedSet)
{
SpeedSet&=0X07;  
SPI2->CR1&=0XFFC7;
SPI2->CR1|=SpeedSet<<3;
SPI2->CR1|=1<<6;  
}

/*
u8 SPI1_ReadWriteByte(u8 TxData)
{      
while((SPI1->SR&1<<1)==0);
SPI1->DR=TxData;
while((SPI1->SR&1<<0)==0);
  return SPI1->DR;
}*/
u8 SPI2_ReadWriteByte(u8 TxData)
{      
while((SPI2->SR&1<<1)==0);
SPI2->DR=TxData;
while((SPI2->SR&1<<0)==0);
  return SPI2->DR;
}


PB12(SPICS)配置如下:

RCC->AHB1ENR |= 1<<1;
GPIO_Set(GPIOB,PIN12,GPIO_MODE_OUT,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_PU);  //PB12(SPI_CS)

#define MAX21100_CS PBout(12)

读芯片ID函数:
u8 MAX21100_ReadID(void)
{
u8 temp = 0;
u8 temp1 = -2;
MAX21100_CS = 0;  //SPI_CS=0, select chip
temp1 = SPI2_ReadWriteByte(MAX21100_WHO_AM_I);
temp = SPI2_ReadWriteByte(0xFF);  
MAX21100_CS = 1;  //SPI_CS=1, deselect chip
return temp;
}

个人感觉这样应该可以正常通信了,配置应无错误。但是实际情况是总是读出0xFF。不知是哪里有没理解到的地方。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-1-5 10:43:55 | 显示全部楼层

示波器看波形,对错立见。



回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
 楼主| 发表于 2016-1-5 11:08:23 | 显示全部楼层
SCK没有波形。所以不明白为何发不出去,感觉配置没有问题。
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-1-5 11:25:27 | 显示全部楼层
phmatthaus 发表于 2016-1-5 11:08
SCK没有波形。所以不明白为何发不出去,感觉配置没有问题。


SCK不是一直有,
要启动数据发送,才会出现。
注意没有?


回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
 楼主| 发表于 2016-1-5 12:59:49 | 显示全部楼层
程序中设置读不到正确Device ID就一直读,100ms一次,在此期间CS是可以看到的,但是SCK看不到,正常来说应该是CS的8倍
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
 楼主| 发表于 2016-1-5 13:13:46 | 显示全部楼层
---------->要启动数据发送,才会出现

怎样启动数据发送?
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
 楼主| 发表于 2016-1-19 09:16:39 | 显示全部楼层
问题已解决。SPI配置部分程序没有问题,是所用传感器在读数据时MSB要置1,即:
SPI2_ReadWriteByte(0x80 | reg);
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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