OpenEdv-开源电子网

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

SPI没有时钟,求测试方法

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-9
在线时间
1 小时
发表于 2013-10-30 21:12:28 | 显示全部楼层 |阅读模式
用的芯片是STM32F207 外接时钟是25M 调了一天 实在是找不到错误出在哪了 请大家路过的帮忙看看

void SPIx_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE );//PORTB时钟使能 
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14| GPIO_Pin_15; //spi端口设置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   //PB12(NSS)推免输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);   

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:片选有软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为8,9M
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式,但crc另需函数启动,本程序中未启用
SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
SPI_Cmd(SPI2, ENABLE); //使能SPI外设

}  
 
    
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
uint8_t retry=0;

        while (SPI_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET);//检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}      
return SPI_ReceiveData(SPI2); //返回通过SPIx最近接收的数据

int main(void)
{
   SPIx_Init();
   while (1)
   {
       SPI2_ReadWriteByte(0xAA); 
   }  

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-30 23:38:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-10-31 08:41:12 | 显示全部楼层
回复【楼主位】悠悠:
---------------------------------
楼主是测SPI的CLK引脚的波形?还是整个SPI通讯口的波形?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-9
在线时间
1 小时
 楼主| 发表于 2013-10-31 12:18:12 | 显示全部楼层
我是测SCLK引脚上的波形
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-9
在线时间
1 小时
 楼主| 发表于 2013-10-31 12:57:48 | 显示全部楼层
是不是我的测试方法有问题啊 我是直接用示波器测的SPI的SCLK引脚和MOSI引脚 什么都没有测到 用万用表测也引脚上SCLK引脚上一直是0,没有电压
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-9-9
在线时间
1 小时
 楼主| 发表于 2013-10-31 14:19:56 | 显示全部楼层
终于找到原因了 stm32f207和stmf407的引脚复用 需要你多开一条语句 其他型号的stm32不清楚需要不需要开 如果大家遇到跟我一样的问题 可以试一下
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);,
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-11-30 02:56:31 | 显示全部楼层
回复【6楼】悠悠:
---------------------------------
这些 语句 是什么作用   ------  设置为 复用推挽输出 才可以实现真正的链接到硬件的SPI脚  ? 这样理解?

我用的 103 也是类似楼主问题  没有解决 
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 14:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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