1、使用rt-thread studio开发SPI与FPGA通信功能,发现FPGA读取数据偶尔会出现异常。
正常时的波形如下图所示:
异常时CS出现毛刺
波形如下图所示:
有两个疑问:
1、使用PIN驱动会产生毛刺信号,不使用PIN驱动不会产生毛刺信号
2、CS拉低以后,很久才会开始发送数据。数据发送完成后,需要很久才会拉高CS
实验代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <drv_spi.h>
#include "drv_common.h"
#define LOG_TAG "SPI"
#define LOG_LVL LOG_LVL_DBG
#include <ulog.h>
#define TEST_DEVICE_NAME "spi2"
static struct rt_spi_device *spi_dev_com;
rt_uint8_t sendbuff[26];
rt_uint8_t rebuff[26];
void test_spi(int arg,char **argv)
{
rt_err_t ret;
rt_size_t len;
static rt_uint8_t aa = 0;
if(aa == 0)
{
aa = 1;
__HAL_RCC_GPIOI_CLK_ENABLE();
rt_hw_spi_device_attach("spi2", "spi20", GPIOI, GPIO_PIN_0);
LOG_I("This is spi test ");
for(rt_uint8_t i=0;i<26;i++)
{
sendbuff[i] = 0x10+i;
}
spi_dev_com = (struct rt_spi_device *)rt_device_find("spi20");
if(!spi_dev_com)
{
LOG_E("not find spi device");
return;
}
else {
struct rt_spi_configuration cfg;
cfg.data_width = 8;
cfg.max_hz = 10*1000*1000;
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB;
ret = rt_spi_configure(spi_dev_com, &cfg);
if(ret != RT_EOK)
{
LOG_E("Config spi failed");
return;
}
}
}
len = rt_spi_transfer(spi_dev_com, sendbuff, rebuff, 26);
if(len != 26)
{
LOG_E("spi write erro");
}
else
{
for(int i=0;i<26;i++)
rt_kprintf("%4d ",rebuff[i]);
}
rt_kprintf("\r\n");
}
MSH_CMD_EXPORT(test_spi,test_spi
是自己写SPI驱动和IO口的驱动,就没有出现毛刺信号。
测试了一下设置CS io口的功能,上拉,下拉都不行。只要是有RT的设备驱动就有问题。
@梦醒了主 我说的上下拉不是芯片内部的 pullup pulldown 配置,而是外部电路外接上拉电阻。
@出出啊 好的,谢谢!