OpenEdv-开源电子网

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

战舰的spi1配置的问题不能接收数据

[复制链接]

5

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2020-4-7
在线时间
29 小时
发表于 2020-10-13 15:10:19 | 显示全部楼层 |阅读模式
10金钱
//SP1的引脚
//RST        PA0
//SPI1_CS    PA4
//SPI1_SCK   PA5
//SPI1_MISO  PA6
//SPI1_MOSI  PA7

//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分频
//SPI_BaudRatePrescaler_8   8分频
//SPI_BaudRatePrescaler_16  16分频
//SPI_BaudRatePrescaler_256 256分频

void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
    SPI1->CR1&=0XFFC7;
    SPI1->CR1|=SPI_BaudRatePrescaler;        //设置SPI1速度
    SPI_Cmd(SPI1,ENABLE);
}

//SPI1的初始化
void SPI1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//PORTA时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,  ENABLE);//SPI2时钟使能

        //SPI1 MOSI(PA7),CLK(PA5) output
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PA5/6/7复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
       
        GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);  //PA5/6/7上拉
       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_4;  // PA4 推挽
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4);  //拉高

    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_Low;                //串行同步时钟的空闲状态为低电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;                //定义波特率预分频的值:波特率预分频值为256
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
    SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

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

    SPI1_ReadWriteByte(0xff);//启动 传输

//        SPI1_SetSpeed(SPI_BaudRatePrescaler_16);//72M/4 = 18M设置为18M时钟,高速模式
}

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(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;

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
    {
        retry++;
        if(retry>200)
        {
            return 0;
        }
    }
    return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}

//接受数据
u8 SPI1_ReadByte(void)
{
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, 0xFF);    //发送与应用不相关的数据,为后续的读数据提供时钟信号
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
    return SPI_I2S_ReceiveData(SPI1);
}


//发送数据
void SPI1_WriteByte(u8 TxData)
{
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, TxData);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
    SPI_I2S_ReceiveData(SPI1);
}

这个时钟信号的宽度时宽时窄,并且,逻辑分析仪抓到数据,但是实际上返回的都是0x00, 调试的时候也都是0x00,这是什么问题谢谢




2020-10-13_150540.png
2020-10-13_150556.png
2020-10-13_150616.png
2020-10-13_150647.png

最佳答案

查看完整内容[请看2#楼]

找到问题了,是因为miso要接mosi,不知道为什么这个芯片要这么搞,一般都是miso接miso的。这个要反着来。也是个坑,手册上也不注明谢谢你
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2020-4-7
在线时间
29 小时
 楼主| 发表于 2020-10-13 15:10:20 | 显示全部楼层
三叶草 发表于 2020-10-14 18:45
不能接收说明你发的读取指令不正确吧,看看是不是协议类型不匹配。也就是说SPI的那四种模式。

找到问题了,是因为miso要接mosi,不知道为什么这个芯片要这么搞,一般都是miso接miso的。这个要反着来。也是个坑,手册上也不注明谢谢你
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-14 18:45:37 | 显示全部楼层
不能接收说明你发的读取指令不正确吧,看看是不是协议类型不匹配。也就是说SPI的那四种模式。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-16 22:14:49 | 显示全部楼层
bl2020 发表于 2020-10-13 15:10
找到问题了,是因为miso要接mosi,不知道为什么这个芯片要这么搞,一般都是miso接miso的。这个要反着来。 ...

miso是主入从出没毛病
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 11:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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