查看: 2405|回复: 1

[求助] 关于MKL16Z128单片机SPI通讯问题

[复制链接]

该用户从未签到

7

主题

178

帖子

0

中级会员

Rank: 3Rank: 3

积分
401
最后登录
2019-7-20
发表于 2019-7-20 10:21:42 | 显示全部楼层 |阅读模式
目前有个问题想请教各位大神,关于MKL16Z128单片机通过SPI1读取Flash(W25Q32)的问题。

通过配置完SPI后,读取Flash 的ID号,一直返回为0xffffff,按照数据手册的说明,应该返回为0XEF15。通过逻辑分析仪进行查看SPI的数据,引脚MISO一直处于高电平。
具体测试的图片见附件。我不知道是什么原因造成的。

目前我使用的都是官方原厂的底层库来做的,没有修改过底层,只在我的应用层进行了配置相关代码。以下是配置的内容:
1.SPI1引脚配置:
    /* Ungate the port clock */
    CLOCK_EnableClock(kCLOCK_PortE);
    /*
     * 注意!!!
     * Initialize ALL GPIO pins below
     * PTA0:SWD_CLK; PTA3:SWD_DIO; PTA18:EXTAL0; PTA19:XTAL0
     * 配置所有除以上4个引脚外的引脚为GPIO功能
     */
    port_pin_config_t port_pin_config = {
                    .pullSelect = kPORT_PullDown,                           //下拉使能
                    .slewRate = kPORT_FastSlewRate,                         //快速转换使能
                    .passiveFilterEnable = kPORT_PassiveFilterDisable,      //无源输入滤波器禁用
                    .driveStrength = kPORT_LowDriveStrength,                //配置为低驱动强度
                    .mux = kPORT_MuxAsGpio,                                 //配置为GPIO
    };
    /*
     * 注意!!!
     * PTA18:EXTAL0; PTA19:XTAL0
     * PTA20:RESET_b
     * PTA0:SWD_CLK; PTA3:SWD_DIO   
     * PTD5:                     SPI1
     * PTE0,PTE1:                SPI1
     * 配置所有除以上引脚外的引脚为GPIO功能
     * 以下为内部下拉  
     * PTE31:SPI1    //Flash   

    PORT_SetMultiplePinsConfig(PORTE, 0xffffffffU & ~(0x03 <<  0) & ~(0x03 << 20) & ~(0x01 << 29), &port_pin_config);
    port_pin_config.pullSelect = kPORT_PullUp;
    /*
     * 注意!!!
     * PTA0:SWD_CLK; PTA3:SWD_DIO; PTA18:EXTAL0; PTA19:XTAL0
     * 配置所有除以上4个引脚外的引脚为GPIO功能
     * 以下为内部上拉
     * 上拉 PTE0,PTE1:      SPI1;             //Flash      
     * 上拉 PTE17:         
     * 上拉 PTE18:         
     * 上拉 PTE19:         
     * 上拉 PTE20,PTE21:    UART0
     * 上拉 PTE23:          MR_EN            
     * 上拉 PTE24,PTE25:    IIC0
     * 上拉 PTE30:          OLED_RES;        
     */

    PORT_SetMultiplePinsConfig(PORTE, 0x00000000U | (0x03 <<  0) |(0x1f << 17) | (0x07 << 23) | (0x01 << 30), &port_pin_config);



    /* Initialize Flash pins below */  //初始化Flash引脚  
#if (FLASH_USED == 1)                                                     
    port_pin_config_t flash_port_pin_config = {
                    .pullSelect = kPORT_PullUp,
                    .slewRate = kPORT_FastSlewRate,
                    .passiveFilterEnable = kPORT_PassiveFilterDisable,
                    .driveStrength = kPORT_HighDriveStrength,
                    .mux = kPORT_MuxAlt2,
    };
    PORT_SetPinConfig(PORTD, 5U, &flash_port_pin_config);                                                   /* Initialize Flash_SPI_SCK pin                                */
    PORT_SetPinConfig(PORTE, 0U, &flash_port_pin_config);                                                   /* Initialize Flash_SPI_MISO pin                            */


    PORT_SetPinConfig(PORTE, 1U, &flash_port_pin_config);                                                  /* Initialize Flash_SPI_MOSI pin                            */

    /* Initialize FLASH pins below */                                                               
    gpio_pin_config.pinDirection = kGPIO_DigitalOutput;
    gpio_pin_config.outputLogic = 1;

    GPIO_PinInit(GPIOE, 31U, &gpio_pin_config);                                                             /* Initialize Flash_SPI_PCS0 pin                           */
#endif


2.初始化SPI配置:
bool spi_flash_init(void)
{  
    uint32_t sourceClock = 0U;     
    if (transfer && sel_high && sel_low)
    {        
        flash_power_off();                                                                                   /* voice 模块 flash上电   CS=0使能SPI   */

        /* Init SPI master */ //Mode 3 (1,1)--CPOL=1,CPHA=1
        spi_master_config_t masterConfig = {

            .enableMaster = true,                         //使能主设备SPI
            .enableStopInWaitMode = false,                //失能停止等待模式
            .polarity = kSPI_ClockPolarityActiveLow,      //空闲时高电平,活动时低电平  
            .phase = kSPI_ClockPhaseSecondEdge,           //第二个边沿开始
            .direction = kSPI_MsbFirst,                   //高位在前
            .dataMode = kSPI_8BitMode,                    //8位数据
            .pinMode = kSPI_PinModeOutput,                // Bidirectional mode. Master: MOSI pin is output;Slave: MISO pin is output.                                    
            .outputMode = kSPI_SlaveSelectAsGpio,         //CS引脚配置为普通IO
            .baudRate_Bps = 100000U,                      //SPI时钟频率100kHz               
        };
        sourceClock = CLOCK_GetFreq(kCLOCK_CoreSysClk);                  //SPI1 is clocked from the system clock.
        SPI_MasterInit(FLASH_SPI_MASTER, &masterConfig, sourceClock);      
        spi_sel_high_func();

        return true;
    }
    return false;
}


3.读取flash的ID:
bool spi_flash_id_read(uint8_t *id_buff)
{   
    uint8_t buff[4];
    if (transfer && sel_high && sel_low) {
        sel_low();
        buff[0] = 0x90;
        buff[1] = 0;
        buff[2] = 0;
        buff[3] = 0;

        transfer(buff, NULL, 4, false);
        transfer(NULL, id_buff, 2,true);
        sel_high();
        return true;
    }
    return false;
}


其中transfer()函数如下:
static bool spi_transfer_func(uint8_t *p_out,                                                               /* SPI 输出数据缓存        */
                       uint8_t *p_in,                                                            /* SPI 读数据缓存          */
                       uint32_t nbytes,                                                           /* 收发数据个数        */
                       bool     end_flag)                                                        /* 是否为最后一次发数据   */
{
    if(0 != nbytes)
        {
            spi_transfer_t xfer = {0};

                /* SPI master start transfer */
                xfer.txData = p_out;
                xfer.rxData = p_in;
                xfer.dataSize = nbytes;
            SPI_MasterTransferBlocking(FLASH_SPI_MASTER, &xfer);
        return true;
        }
    return false;
}



以上是关于SPI1配置的和处理的所有相关的函数。因为我在使用SPIO的时候也是这样的问题,能够发送数据,但是从设备没有任何数据返回。
所有的SPI通讯都是查询方式进行。

以下是读取ID(0x90)的波形。
spi_flash逻辑分析波形0x90.png

spi_flash逻辑解码数据0x90.png
烦请各位不吝赐教,非常感谢。

我知道答案 目前已有1人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4899

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6321
    最后登录
    2025-7-15
    发表于 2019-7-22 09:13:32 | 显示全部楼层

    回帖奖励 +5 NXP金币

    参考官方KL26的程序即可,搜论坛的YL-KL26
    开心
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-21 16:50 , Processed in 0.088545 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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