查看: 2549|回复: 4

[求助] KL02硬件SPI问题。

[复制链接]
  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
    发表于 2017-3-6 14:04:29 | 显示全部楼层 |阅读模式
         路过的版友你们好!有空的版友帮忙看看是我的程序那里出错了,我的问题如下:     我用KL02开发版的SPI0去读取RF模块的数据,从逻辑分析仪抓到的数据看,SPI输出数据没问题,但RF没返回数据。
         没数据返回,出问题的无非硬件或者程序问题。首先排除硬件问题,我先用硬件SPI的四个引脚相对应的用作模拟SPI四个引脚,可以正确读到返回数据,说明硬件没啥问题。
         这是参考官方例程和论坛上版友的程序写的程序如下:

    void SPI_Init(void)
    {

      PORT_SetPinMux(PORTA, 5U, kPORT_MuxAlt3); //nss
      PORT_SetPinMux(PORTB, 0U, kPORT_MuxAlt3); //MISO
      PORT_SetPinMux(PORTA, 6U, kPORT_MuxAlt3); //MOSI
      PORT_SetPinMux(PORTA, 7U, kPORT_MuxAlt3); //SCK

      //RF_Reset引脚配置
      GPIOB->PDDR |= (1<<2);  //设置引脚为输出模式
      PORTB->PCR[2] &= ~(PORT_PCR_MUX_MASK|PORT_PCR_IRQC_MASK|PORT_PCR_PE_MASK);
    //配置 GPIO 口
      PORTB->PCR[2] |= PORT_PCR_MUX(0x01);  

      //先关闭SPI模块
      SPI0->C1 &= ~SPI_C1_SPE_MASK;
      //主模式
      SPI0->C1 |= SPI_C1_MSTR_MASK;
      //高位先发
      SPI0->C1 &= ~SPI_C1_LSBFE_MASK;
      //SPI帧格式选择
      SPI0->C1 |= SPI_C1_CPHA_MASK;
      SPI0->C1 |= SPI_C1_CPOL_MASK;
      //主机SS引脚作为SS引脚
      SPI0->C2 |= SPI_C2_MODFEN_MASK;
      SPI0->C1 |= SPI_C1_SSOE_MASK;
      //设置波特率
      SPI0->BR = (SPI_BR_SPPR(0x02) | SPI_BR_SPR(0x05));
      SPI0->C1 |= SPI_C1_SPE_MASK;

    }

    uint8_t SPI_WriteReadByte(uint8_t data)
    {
        uint8_t temp;
       while(!(SPI0->S & SPI_S_SPTEF_MASK ) );
           SPI0->D = data;
        while(!(SPI0->S & SPI_S_SPRF_MASK ) );
         temp=SPI0->D;
         return temp;
    }



    int main(void)
    {
      uint32_t ch;
      uint8_t j=1,i=0;
      set_fee();
      CLOCK_EnableClock(kCLOCK_PortA);
      CLOCK_EnableClock(kCLOCK_PortB);
      CLOCK_EnableClock(kCLOCK_Spi0);
       SPI_Init();
      //重启RF
      RF_Reset_0;
      for(i=100;i!=0;i--)                                    
        asm("NOP");

      RF_Reset_1;

       while(1)
      {
        ch= SPI_WriteReadByte(0x42);
        ch ++;
      }
    }


    接着我将NSS引脚设置为普通IO口,自己控制NSS片选时机,即修改
    //主机SS引脚作为普IO口
      SPI0->C2 &= ~SPI_C2_MODFEN_MASK;
    但结果还是一样读不到。后来我鬼使神差的在主循环里多加了一句 ch= SPI_WriteReadByte(0x42);  即修改为
      while(1)
      {
        ch= SPI_WriteReadByte(0x42);
        ch= SPI_WriteReadByte(0x42);
        ch ++;
      }

    竟然读到RF正确的返回数据,后来把第二个写入RF的值修改为0,一样可行。我在惊喜万分之余又非常不理解,难道说RF返回的数据有点慢,第二次读的时候才能读到?但读写函数里有个死等返回数据,按理说没数据来应该过不了的。但我仿真的时候发现,我在把数据写进SPI后,接收标志位立刻被置了起来,看图一。

    我将写0语句去掉,直接再加一个死等,
    while(1)
      {
        ch= SPI_WriteReadByte(0x42);

        while(!(SPI0->S & SPI_S_SPRF_MASK ) );
         j=SPI0->D;
         j++;


        ch ++;
      }

    但仿真时直接死等while(!(SPI0->S & SPI_S_SPRF_MASK ) );看图二


    我的问题:
    1:我的SPI配置是否还有遗漏或者配置错了。
    2:图1现象怎么理解?不是没返回数据吗?SPI有数据SPRF标志位怎么被置1了。
    3:图2现象怎么理解?必须有数据写进去才有数据返回吗?














    我知道答案 目前已有4人回答

    图一

    图一
    捕获2.PNG
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2017-3-6 14:05:35 | 显示全部楼层
    自己顶顶!!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-25 10:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    15

    主题

    81

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    272
    最后登录
    2019-6-10
     楼主| 发表于 2017-3-6 14:21:11 | 显示全部楼层
    万能的版友,求助攻。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2017-3-6 17:12:34 | 显示全部楼层
    void SPI_Config(void)
    {
        uint32_t sourceClock=0;
        spi_master_config_t masterConfig = {0};
        gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1,};
           
        CLOCK_EnableClock ( SPI_CS_CLOCK);//¿ªÆôPTD¶Ë¿ÚʱÖÓ
        CLOCK_EnableClock ( SPI_SCK_CLOCK);//¿ªÆôPTD¶Ë¿ÚʱÖÓ
        CLOCK_EnableClock ( SPI_MOSI_CLOCK);//¿ªÆôPTD¶Ë¿ÚʱÖÓ
        CLOCK_EnableClock ( SPI_MISO_CLOCK);//¿ªÆôPTD¶Ë¿ÚʱÖÓ

        PORT_SetPinMux(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_MUX);
        PORT_SetPinMux(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_MUX);
        PORT_SetPinMux(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_MUX);
        PORT_SetPinMux(SPI_CS_PORT, SPI_CS_PIN, kPORT_MuxAsGpio);
        GPIO_PinInit (SPI_CS_GPIO,SPI_CS_PIN,&cs_config);
        SPI_MasterGetDefaultConfig(&masterConfig);

         masterConfig.enableStopInWaitMode = false;
         masterConfig.polarity = 1;//1
         masterConfig.phase = kSPI_ClockPhaseSecondEdge;//ʱÖÓÏàλ
         masterConfig.direction = kSPI_MsbFirst;
         masterConfig.dataMode = kSPI_8BitMode;
         //masterConfig.txWatermark = kSPI_TxFifoOneHalfEmpty;
         //masterConfig.rxWatermark = kSPI_RxFifoOneHalfFull;
         masterConfig.pinMode = kSPI_PinModeNormal;//
         masterConfig.outputMode = kSPI_SlaveSelectAsGpio;
         masterConfig.baudRate_Bps = 5000000U;
        // SPI_MasterGetDefaultConfig(&masterConfig);
         sourceClock = CLOCK_GetFreq(kCLOCK_BusClk);
         SPI_MasterInit(SPIBASE, &masterConfig, sourceClock);
         //SPI_MasterTransferCreateHandle(SPI0, &masterHandle, masterCallback, NULL);
    }

    void SPI_Transfer(uint8_t *txData,uint8_t *rxData,uint8_t size)
    {
        spi_transfer_t masterXfer;
        masterXfer.txData = txData;
        masterXfer.rxData = rxData;
        masterXfer.dataSize = size;
        SPI_MasterTransferBlocking(SPIBASE, &masterXfer);
    //    while (masterFinished != true)
    //    {
    //    }
    }

    uint8_t SPI_ReadWriteByte(uint8_t inData)
    {
        uint8_t a = inData,b=0x00;
        SPI_Transfer(&a,&b,1);
        return b;

    }

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2017-3-6 17:13:16 | 显示全部楼层
    KL26正常实用的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 09:00 , Processed in 0.090206 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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