技术范儿 发表于 2016-12-20 18:44:24

(已解决)STM8L151的SPI1调不通啊

本帖最后由 技术范儿 于 2016-12-21 15:51 编辑

RT,最近用STM8L151K4的SPI1外挂无线模块,感觉SPI不听使唤呢,下面是我的代码和抓到的波形图,请大家指点一下。#define SPI_PIN_SCK_PORT                            GPIOB
#define SPI_PIN_SCK                                 GPIO_Pin_5

#define SPI_PIN_MOSI_PORT                           GPIOB
#define SPI_PIN_MOSI                              GPIO_Pin_6

#define SPI_PIN_MISO_PORT                           GPIOB
#define SPI_PIN_MISO                              GPIO_Pin_7

                  

#if 1
void SpiInit( void )
{
   /* Enable SPI clock */
    GPIO_Init(SPI_PIN_SCK_PORT,   SPI_PIN_SCK , GPIO_Mode_Out_PP_Low_Fast);
    GPIO_Init(SPI_PIN_MOSI_PORT , SPI_PIN_MOSI , GPIO_Mode_Out_PP_Low_Fast);   
    GPIO_Init(SPI_PIN_MISO_PORT , SPI_PIN_MISO , GPIO_Mode_In_PU_No_IT);
    SPI_DeInit(SPI1);
    CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
    //SPI_DeInit(SPI1);
    //GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);
    //GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);
      //主机模式,配置为输入 该设置很关键
    //GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
    /* Initialize SPI */
    SPI_Init(
             SPI1,
             SPI_FirstBit_MSB,
             SPI_BaudRatePrescaler_16,
             SPI_Mode_Master,
             SPI_CPOL_Low,
             SPI_CPHA_1Edge,
             SPI_Direction_2Lines_FullDuplex,
             SPI_NSS_Soft,
             0x07
             );
    SPI_Cmd(SPI1,ENABLE);
}




uint8_t SpiInOut( uint8_t outData )
{

/* Loop while DR register in not emplty */
          while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET);
      
          /* Send byte through the SPI1 peripheral */
          SPI_SendData(SPI1, outData);
      
          /* Wait to receive a byte */
          while (SPI_GetFlagStatus(SPI1, SPI_FLAG_RXNE) == RESET);
      
          /* Return the byte read from the SPI bus */
         return SPI_ReceiveData(SPI1);
}
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
    uint8_t i;
   
    GPIO_WriteBit( NSS_IOPORT, NSS_PIN, RESET );
   
    //temp = SpiInOut( addr | 0x80 );
    SpiInOut( addr);
    //SpiInOut(0);
    for( i = 0; i < size; i++ )
    {
      SpiInOut(buffer);
      //SpiInOut(0);
    }
   
    GPIO_WriteBit( NSS_IOPORT, NSS_PIN, SET );
   
    //SPI_Cmd(SPI1,DISABLE);
}
最后调用SX1276Write(0xff,0x02);发现裸机分析仪抓到的和写入的值不一致,而且相差很多。用的是内部16M时钟

斜阳__ 发表于 2016-12-21 09:16:31

帮顶            

风子 发表于 2016-12-21 09:57:40

    GPIO_Init(SPI_PIN_SCK_PORT,   SPI_PIN_SCK , GPIO_Mode_Out_PP_Low_Fast);
    GPIO_Init(SPI_PIN_MOSI_PORT , SPI_PIN_MOSI , GPIO_Mode_Out_PP_Low_Fast);   
    GPIO_Init(SPI_PIN_MISO_PORT , SPI_PIN_MISO , GPIO_Mode_In_PU_No_IT);
去掉这几行,不需要

sssdd 发表于 2016-12-21 13:26:36

SX1276Write函数声明在哪?
偶们只看到了
SX1276WriteBuffer

技术范儿 发表于 2016-12-21 15:50:43

谢谢各位支持。跟硬件没关系,堆栈溢出到RAM区域,导致函数传参数的时候传错了

酱油先生 发表于 2017-10-10 15:32:19

朋友能发一份硬件SPI的例程给我吗 luoyi654@163.com

lmy11224433 发表于 2018-3-2 15:33:25

技术范儿 发表于 2016-12-21 15:50
谢谢各位支持。跟硬件没关系,堆栈溢出到RAM区域,导致函数传参数的时候传错了 ...

SPI使能之后,读写数据就有SCK时钟了?

xiatangtang 发表于 2018-8-22 10:38:21

请教一下,读数据怎么做呢?发完读指令直接读吗?

daidingdong 发表于 2019-5-11 10:28:47

楼主,能否请教一下关于这方面的问题,可以发一份这个历程吗,微信dddcmr,邮箱2454600872@qq.com,我做那个是stml151u6与a7139,请教下,十分感谢
页: [1]
查看完整版本: (已解决)STM8L151的SPI1调不通啊