本帖最后由 54zw 于 2017-3-23 00:29 编辑
使用firefly spi demo 读id,会有下面这样的日志,间断性无法读到ID
[ 1108.239354] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ef 40 18 00 00
[ 1108.239449] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ef 40 18 00 00
[ 1113.247362] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ff ff ff ff ff
[ 1113.247447] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ff ff ff ff ff
[ 1118.255374] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ef 40 18 00 00
[ 1118.255494] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ef 40 18 00 00
[ 1123.263382] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ff ff ff ff ff
[ 1123.263501] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ff ff ff ff ff
[ 1128.271376] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ef 40 18 00 00
[ 1128.271497] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ef 40 18 00 00
[ 1133.279384] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ef 40 18 00 00
[ 1133.279504] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ef 40 18 00 00
[ 1138.287380] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ff ff ff ff ff
[ 1138.287500] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ff ff ff ff ff
[ 1143.295380] firefly-spi spi0.0: firefly_spi_read_w25x_id_0: ID = ef 40 18 00 00
[ 1143.295500] firefly-spi spi0.0: firefly_spi_read_w25x_id_1: ID = ef 40 18 00 00
代码在原有基础上用定时器不断读取ID
static void timeout_handler(unsigned long tdata)
{
struct spi_device *spi = (struct spi_device *)tdata;
g_sds.timer.expires = jiffies + EXPIRES_PERIOD;
add_timer(&g_sds.timer);
firefly_spi_read_w25x_id_0(spi);
firefly_spi_read_w25x_id_1(spi);
}
static int firefly_spi_probe(struct spi_device *spi)
{
int ret = 0;
struct device_node __maybe_unused *np = spi->dev.of_node;
dev_dbg(&spi->dev, "Firefly SPI demo program\n");
if(!spi)
return -ENOMEM;
dev_dbg(&spi->dev, "firefly_spi_probe: setup mode %d, %s%s%s%s%u bits/w, %u Hz max\n",
(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",
(spi->mode & SPI_3WIRE) ? "3wire, " : "",
(spi->mode & SPI_LOOP) ? "loopback, " : "",
spi->bits_per_word, spi->max_speed_hz);
/* init timer */
init_timer(&g_sds.timer);
/* setup the timer */
g_sds.timer.expires = jiffies + EXPIRES_PERIOD;
g_sds.timer.function = timeout_handler;
g_sds.timer.data = (unsigned long)spi;
/* add to system */
add_timer(&g_sds.timer);
return ret;
}
硬件连接图如下:

