OpenEdv-开源电子网

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

SPI 的MiSO什么都不连,持续收到0Xff

[复制链接]

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-8-10 09:18:02 | 显示全部楼层 |阅读模式
继续做SPI的实验,Stm32F107VCT6的SPI1做主机,MISO放在那里,不接从机。结果接收数组里一直是0xff,这是为什么?
代码如下
#include "SPI1.h"

/* Private macro -------------------------------------------------------------*/
//#define SPI3_CS_LOW()        GPIO_ResetBits(GPIOA, GPIO_Pin_15)    //片选引脚/CS拉低
//#define SPI3_CS_HIGH()        GPIO_SetBits(GPIOA, GPIO_Pin_15)  //片选引脚/CS拉高

#define BufferSize  8
#define ReSize        50
char SPI1_Buffer_Tx[BufferSize] = {0x01,0x02,0x04,0x08,0x10,0x11,0x20,0x40};
char SPI1_Buffer_Rx[ReSize] = {0x00};
/**-----------------------------------------------------------------
  * @函数名
  * @功能   
  *         
  * @参数   无
  * @返回值 无
***----------------------------------------------------------------*/



void SPI1_Init(void)
{

    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   
    /* 使能SPI1和GPIOA的RCC时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    /* Configure SPI1 pins: SCK, MISO and MOSI --------------------------------*/
    /*Pin5:SCK; Pin7:MOSI-------------------------------------------*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);   


    /* SPI1初始化配置*/
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //主模式
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI通信数据的大小
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        //时钟极性
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;   //时钟相位
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;      //片选信号,软件模式
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;    //SPI分频值,分频后的值为SCK的时钟频率
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //选择SPI通信时,是高位数据在前还是低位数据在前
    SPI_InitStructure.SPI_CRCPolynomial = 7;    //与CRC校验有关
    SPI_Init(SPI1, &SPI_InitStructure);

    /*使能SPI1 */
    SPI_Cmd(SPI1, ENABLE);            
}

//void SPI3_WriteData(char da);
//uint16_t SPI3_ReadData(void);

void SPI1_Test(void)
{   
    char Tx_Idx = 0, Rx_Idx = 0;
    while(Tx_Idx < BufferSize)
    {      
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,SPI1_Buffer_Tx[Tx_Idx]);

        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
        SPI1_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI1);

        Tx_Idx++;
        Rx_Idx++;
    }   
    /*拉高片选信号*/
    //SPI3_CS_HIGH();
}

void SPI1_SendData(void)
{   
    char Tx_Idx = 0;
    while(Tx_Idx < BufferSize)
    {      
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,SPI1_Buffer_Tx[Tx_Idx]);

//        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
//        SPI1_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI1);
        Tx_Idx++;
    }   
}

void SPI1_ReceiveData(void)
{   
    char Rx_Idx = 0;
//    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
//    SPI_I2S_SendData(SPI1,0x11);
    while(Rx_Idx < ReSize)
    {      
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,0x11);

        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
        SPI1_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI1);

           Rx_Idx++;
    }   

}

我在main函数里运行,SPI1_init ,和 SPI1_ReceiveData 函数。用keil仿真,看到SPI1_Buffer_Rx中全是0xff
哪位高手,能解释下原理。大家一起探讨探讨

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-10 09:51:19 | 显示全部楼层

很正常。
数字电路,要么判为0,要么判为1,没有其他可能,
现在全部判为1,可能和内部电路有关。

既然不关心它的数据,不管它就是了。
如果主机不接收数据,这个脚完全可以做普通IO用。

回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
 楼主| 发表于 2016-8-15 13:54:52 | 显示全部楼层
xuande 发表于 2016-8-10 09:51
很正常。
数字电路,要么判为0,要么判为1,没有其他可能,
现在全部判为1,可能和内部电路有关。

开发板上有插针把GPIO口都引出来了,这些插针可以直接使用吗。我的一个开发板上插针的GPIO一直是高电平,没发现这个有特别之处,拉不低。还有一个一直低电平,拉不高。会是什么原因????
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 18:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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