在线时间44 小时
UID382303
注册时间2015-6-3
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 401
- 最后登录
- 2019-7-20
|
目前有个问题想请教各位大神,关于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)的波形。
烦请各位不吝赐教,非常感谢。
|
|