OpenEdv-开源电子网

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

关于spi的配置问题

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-3-14 16:54:29 | 显示全部楼层 |阅读模式
请问一下,我的spi 配置完了之后,为什么clk和mosi都没有输出了,而且clk结果成了高电平了,mosi干脆一点反应都没有了?求解,困扰我好久了这个问题?
追求卓越!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2012-11-3
在线时间
30 小时
发表于 2014-3-14 17:09:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-14 17:27:45 | 显示全部楼层
贴SPI初始化代码看看
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 17:59:42 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
void SPI1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTA时钟使能 并且时能SPI1时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能 
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;    //PA5为时钟输出,PA7为MOSI传输
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/7复用推挽输出 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PA4为通用推挽输出,用于驱动tm1629a的stb脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_7);  //PA5//7上拉
// GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_4);

SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //设置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位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB; //指定数据传输从MSB位还是LSB位开始:数据传输从LSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}
追求卓越!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 18:00:33 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
大神求解!
追求卓越!
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-3-14 19:02:55 | 显示全部楼层
回复【4楼】冬日里的篱笆:
---------------------------------
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //设置SPI为单线双向只发送的数据模式: 
改为双线双工模式
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 20:06:52 | 显示全部楼层
回复【6楼】ricefat:
---------------------------------
我改了,可是发现还是不行的,好奇怪,我都搞了好久了!
追求卓越!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 20:14:53 | 显示全部楼层
回复【7楼】冬日里的篱笆:
---------------------------------
追求卓越!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 20:17:26 | 显示全部楼层
我的发送程序和主程序是:
u8 SPI1_SendData(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)
  return 0;
}  
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
retry=0;
    return 1;
}
const uint8_t ST_To_TM1629A_Data[5]={0x44,0xce,0x02,0x87};
#define SIZE sizeof(ST_To_TM1629A_Data)
int main(void)
{
u16 i=0;
        delay_init();
SPI1_Init(); 
NVIC_Configuration();
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
for(i=0;i<SIZE;i++)
{
SPI1_SendData(ST_To_TM1629A_Data);
delay_us(1);
}
GPIO_SetBits(GPIOA,GPIO_Pin_4);  

}   大神们觉得有什么问题么?欢迎交流!
追求卓越!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-14 20:46:02 | 显示全部楼层
我觉得是主函数的问题!但是我是初学者,对这玩意又不是很熟,我真的找不到错在了,望大神们援助小弟!
追求卓越!
回复 支持 反对

使用道具 举报

26

主题

202

帖子

3

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-3-4
在线时间
11 小时
发表于 2014-3-15 01:53:27 | 显示全部楼层
主函数中知识调用你的初始化函数,应该还是配置的问题
随遇而安,无愧于心?---?行者?任
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-15 08:16:22 | 显示全部楼层
回复【5楼】冬日里的篱笆:
---------------------------------
在发送数据的时候你用示波器或者逻辑分析仪抓下管脚的波形看下什么样子的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-15 11:10:12 | 显示全部楼层
回复【12楼】Badu_Space:
---------------------------------
我用示波器看了,发现示波器没有数据,就只有nss引脚是符合要求的
追求卓越!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-15 11:15:52 | 显示全部楼层
回复【13楼】冬日里的篱笆:
---------------------------------
这时我的初始化代码,看到你的好像有问题,你试下我这个看下
void SPI_GPIO_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //开启SPI1外设时钟
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //开启SPI2外设时钟

SPIx_CSPin_Init(); //初始化相关的CS管脚

/* 初始化GPIOA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/6/7复用推挽输出 

GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); //PA5.6.7上拉

// SPI_Cmd(SPI1, DISABLE); // SPI外设不使能

/* 初始化SPI1 */
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数据帧结构为8bit模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //设置SPI串行时钟的稳态:设置SPI时钟悬空为高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //设置SPI数据捕获方式:设置SPI数据捕获方式为第二个时钟沿
// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //设置SPI串行时钟的稳态:设置SPI时钟悬空为低
// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //设置SPI数据捕获方式:设置SPI数据捕获方式为第一个时钟沿      
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //设置SPI NSS(片选信号)控制方式:设置SPI NSS控制方式为软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //设置SPI波特率预分频值:设置SPI预分频值为4分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定SPI数据传送是从MSB开始还是LSB开始:设置SPI传送数据从MSB开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //设置SPI CRC值计算的多项式:设置SPI CRC计算多项式7

SPI_Init(SPI1, &SPI_InitStructure); //初始化SPI1外设

SPI_Cmd(SPI1, ENABLE); //使能SPI1外设

SPIx_WriteRead_Data(0xff);
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-15 13:45:53 | 显示全部楼层
回复【14楼】Badu_Space:
---------------------------------
您的       SPIx_CSPin_Init(); //初始化相关的CS管脚 
这个函数了?
追求卓越!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-16 00:37:49 | 显示全部楼层
回复【15楼】冬日里的篱笆:
---------------------------------
你自己编写一下咯
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-19 16:10:50 | 显示全部楼层
可以了,谢谢
追求卓越!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-13 16:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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