OpenEdv-开源电子网

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

stm32作为SPI从机求助!!!!

[复制链接]

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
发表于 2017-12-25 10:20:14 | 显示全部楼层 |阅读模式
求助论坛里的大神。该系统设计两个MCU:STM32F103和NRF51822。两者之间通过SPI通讯接口进行通讯。STM32作为从机通过中断的方式接收nrf发来的数据,这一功能已经实现。目前stm32端有数据想发送至nrf端,目前实现这个功能小弟想请教下原子哥和论坛大大们。
1、SPI时钟由主机nrf51822提供,所以我是这个设计的:
     将一个空闲IO口作为stm32往nrf51822端发送数据的标志。该IO口一直保持高电平,stm32端有数据发送时,stm32将此IO拉低,nrf51822判别该IO口被拉低了,nrf发送无效数据读取stm32端的数据。小弟调试之后发现比如:stm32端发送数据为A,nrf51822端接收数据有可能是0xA0,0xA,0x82,0x14等0xa移位的数据。
在此请教下,论坛大大们,这样的方式可行不可行?还有,nrf端收到移位的数据这个跟什么配置有关系,该如何解决?
下面是stm32 spi slave配置:
void SPI_slave(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef SPI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    //Enable SPI2 clock and GPIO clock for SPI2 and SPI
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    /*
        13  ----  SCK
        12  ----  NSS
        14  ----  MISO
        15  ----  MOSI
        */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
    GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
       
    //1st phase: SPI2 slave
    //SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//Ôúμú¶t¸öÑØ½øDD2éÑù
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2, &SPI_InitStructure);

        /* Set the Vector Table base location at 0x08000000 */
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

        SPI_Cmd(SPI2, ENABLE);
        /* Enable SPI2 RXNE interrupt */   
    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);

}


nrf51822端spi配置代码如下所示:
uint32_t* spi_master_init(SPIModuleNumber module_number, SPIMode mode, bool lsb_first)
{
    uint32_t config_mode;

    NRF_SPI_Type *spi_base_address = (SPI0 == module_number)? NRF_SPI0 : (NRF_SPI_Type *)NRF_SPI1;

    if(SPI0 == module_number)
    {
        /* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */
        nrf_gpio_cfg_output(SPI_PSELSCK0);
        nrf_gpio_cfg_output(SPI_PSELMOSI0);
        nrf_gpio_cfg_input(SPI_PSELMISO0, NRF_GPIO_PIN_NOPULL);
        nrf_gpio_cfg_output(SPI_PSELSS0);

        /* Configure pins, frequency and mode */
        spi_base_address->PSELSCK  = SPI_PSELSCK0;
        spi_base_address->PSELMOSI = SPI_PSELMOSI0;
        spi_base_address->PSELMISO = SPI_PSELMISO0;
        nrf_gpio_pin_set(SPI_PSELSS0); /* disable Set slave select (inactive high) */
    }
    else
    {
        /* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI1*/
        nrf_gpio_cfg_output(SPI_PSELSCK1);
        nrf_gpio_cfg_output(SPI_PSELMOSI1);
        nrf_gpio_cfg_input(SPI_PSELMISO1, NRF_GPIO_PIN_NOPULL);
        nrf_gpio_cfg_output(SPI_PSELSS1);

        /* Configure pins, frequency and mode */
        spi_base_address->PSELSCK  = SPI_PSELSCK1;
        spi_base_address->PSELMOSI = SPI_PSELMOSI1;
        spi_base_address->PSELMISO = SPI_PSELMISO1;
        nrf_gpio_pin_set(SPI_PSELSS1);         /* disable Set slave select (inactive high) */
    }

    spi_base_address->FREQUENCY = (uint32_t) SPI_OPERATING_FREQUENCY;

    /*lint -e845 -save // A zero has been given as right argument to operator '!'" */
    /** @snippet [SPI Select mode] */
    switch (mode )
    {
       //ËÄÖÖSPIÄ£ê½
        case SPI_MODE0:
            config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
            break;
        case SPI_MODE1:
            config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
            break;
        case SPI_MODE2:
            config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
            break;
        case SPI_MODE3:
            config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
            break;
        default:
            config_mode = 0;
            break;

    }


/*add by hss*/
        bool ret1;
        // SPI1 3&#245;ê&#188;&#187;ˉ
    ret1 = spi1_init(SPI1,0);   /** test with shift Msb first mode 0 £&#172;ó&#235;stm32μ&#196;SPI&#197;&#228;&#214;&#195;ò&#187;&#209;ù*/
        if(!ret1)
        {
                return false;
        }
        /*end by hss*/       

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

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 10:33:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 10:45:35 | 显示全部楼层
求论坛大大们关注关注,给个思路啊。
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 11:45:24 | 显示全部楼层
有人帮忙看看么
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 16:24:31 | 显示全部楼层
求思路~~~~~~~
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-15
在线时间
19 小时
发表于 2017-12-25 16:55:58 | 显示全部楼层
是不是     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;              //空闲状态时,时钟为高电平
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //第二个时钟沿开始采样数据
这里设置有问题
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-11-15
在线时间
19 小时
发表于 2017-12-25 16:57:18 | 显示全部楼层
我现在也在用stm32f103做从 在中断中发送数据给主控,现在发现在miso上需要2个byte也就是16个clk后才会输出数据 这个是怎么回事?
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 17:25:55 | 显示全部楼层
ztg328 发表于 2017-12-25 16:57
我现在也在用stm32f103做从 在中断中发送数据给主控,现在发现在miso上需要2个byte也就是16个clk后才会输出 ...

你的是stm32 + 什么芯片?我们可以加个QQ详细聊下
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-25 17:31:17 | 显示全部楼层
ztg328 发表于 2017-12-25 16:55
是不是     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;              //空闲状态时,时钟为高电平
    SPI_Init ...

这里修改成与主机nrf一致的也还是会发生移位
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-11-21
在线时间
17 小时
 楼主| 发表于 2017-12-28 13:11:23 | 显示全部楼层
ztg328 发表于 2017-12-25 16:55
是不是     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;              //空闲状态时,时钟为高电平
    SPI_Init ...

这里倒没什么问题,主要是NSS设置成了软件了。修改成硬件之后,就基本上没什么问题了
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2018-1-16
在线时间
37 小时
发表于 2018-4-24 14:54:44 | 显示全部楼层
我也在做类似的工作,求教从机部分的主函数怎么写
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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