历史上的今天
今天是:2025年04月11日(星期五)
2019年04月11日 | 模拟SPI实现和调试流程
2019-04-11 来源:eefocus
一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk、spi_cs、spi_mosi、spi_miso四个引脚的输入输出即可,具有很好的可移植性。
下面我以stm32为例,简单讲解一下模拟spi的实现和调试流程,实例中spi以上升沿来进行收发数据
1、首先先贴出代码
//初始化spi_clk、spi_cs、spi_mosi、spi_miso四个io
//spi_cs
GPIO_Initure.Pin=SIMULATE_SPI_CS_PIN; //PC10
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
//spi_clk
GPIO_Initure.Pin=SIMULATE_SPI_CLK_PIN; //PC11
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
//spi_miso
GPIO_Initure.Pin=SIMULATE_SPI_MISO_PIN; //PC112
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
//spi_mosi
GPIO_Initure.Pin=SIMULATE_SPI_MOSI_PIN; //PC113
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
void simulate_spi_write_byte(u8 data)
{
u8 kk;
SIMULATE_SPI_CS = 0;
SIMULATE_SPI_CLK = 0;
SIMULATE_DELAY_US; //读取第一bit数据 等待数据稳定 根据实际时钟调整
//大概的spi时钟为1/2us=500KHZ 左右
for(kk=0;kk<8;kk++)
{
//高位在前发送方式 根据升级器件特性定
if((data&0x80)==0x80) SIMULATE_SPI_MOSI = 1;
else SIMULATE_SPI__MOSI = 0;
SIMULATE_DELAY_US; //等待数据稳定 根据实际时钟调整
SIMULATE_SPI_CLK = 1;//上升沿发送数据
SIMULATE_DELAY_US;//CLK高电平保持一段时间 这个可以不需要 根据具体的spi时钟来确定
SIMULATE_SPI_CLK = 0; //把时钟拉低实现为下一次上升沿发送数据做准备
data = data<<1;//发送数据的位向前移动一位
}
SIMULATE_SPI_CS = 1;
}
u8 simulate_spi_read_byte(void)
{
u8 kk=0, ret=0;
SIMULATE_SPI_CS = 0;
SIMULATE_SPI_CLK = 0;
SIMULATE_DELAY_US;//读取第一bit数据 等待数据稳定 根据实际时钟调整
//大概的spi时钟为1/2us=500KHZ 左右
for(kk=0;kk<8;kk++)
{
ret = ret<<1; //读的时候 高位在前 根据升级器件特性定
SIMULATE_SPI_CLK = 1; //上升沿读取数据
if(SIMULATE_MISO) ret |= 0x01;
SIMULATE_DELAY_US;//根据实际时钟调整,可以不添加
SIMULATE_SPI_CLK = 0;//标识数据接收完毕
SIMULATE_DELAY_US; //等待数据稳定 根据实际时钟调整
}
SIMULATE_SPI_CS = 1;
return ret;
}
2、SPI调试的注意点
1)spi读取和发送数据前,等待数据稳定的延时是有必要添加的,否则,存在时钟在跳变的同时,数据也在跳变的情况,这个时候读回来的数据有可能不准确,可能是0或1。
2)根据器件的特性说明,设置读取的方式,高位在前还是低位在前,当然有些器件会在读取或者写入数据的时候,有些特殊的时序要求,这个就另作说法了,如SSD2828器件。
3)spi是否能够正常读写器件,最好的判断方法就是读取器件的id,可以循环去读取,测试是否能够正确返回id,如果不行则需结合示波器查看波形。
4)spi器件的复位管脚也非常重要,如果复位脚一直处于复位的状态,那么这个时候也是无法正确读写器件的
上一篇:基于UART实现数据的自发自收
史海拾趣
|
小灵通生产持续负增长 2006-6-8 信息产业部6月6日发布了电子信息产业的最新调查,调查显示,今年1到4月份,小灵通的生产“依旧呈不断下降趋势”。尽管欲借“消化月租”进一步增强自身价格优势,但小灵通抗衡移动电话的优势正在逐步萎缩。 ...… 查看全部问答> |
|
平台:S3C2440+WINCE5。0+EBOOT 问题1:在Eboot输出的调试信息中TOC的ID[1],打印出来的信息中dwLoadAddress:0x80200000 dwJumpAddress:0x8037cf88 其中dwLoadAddress是把nk.bin拷贝到RAM的虚拟地址,dwJumpAddress应 ...… 查看全部问答> |
|
U盘刚插入电脑时,在出现盘符之前,怎样用DeviceIoControl和驱动通信????? U盘刚插入电脑时,在出现盘符之前,怎样用DeviceIoControl和驱动通信????? DeviceIoControl的一个参数是u盘的句柄,此时没有盘符,怎样获得u盘的句柄呢??… 查看全部问答> |
|
本人工作四年,前面三年多时间一直从事家电领域变频空调的产品开发,但受困于行业发展实在内耗太大,利润太薄,且开发周期过长,成就感不足.于是开始找工作,得到华为口头offer.但一等就是2月,才发正式offer.但这时已经在另外一家比较大的公司从事消费电 ...… 查看全部问答> |
|
本系列一共四章,下面是第一部分,主要讨论芯片开发和生产过程中的IC测试基本原理, 内容覆盖了基本的测试原理,影响测试决策的基本因素以及IC测试中的常用术语。 第一章 数字集成电路测试的基本原理 器件测试的主要目的是保证器件在恶劣的 ...… 查看全部问答> |
|
需要制作硬件和调试,功能要求简单,类似学习板。 项目可考虑分成或者一次性支付,有意向的发信息给我。或者EMAIL: HOLLYCAT@21CN.COM… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:52 编辑 今年大一,学了点C,现在水平很一般,不过想参加省赛。。无比热情说动了两个同学。。现在准备想项目。。。智慧城市。。可是完全没感觉,求帮助,告诉我该怎么办?不是求项目,只是求指教!!!! ...… 查看全部问答> |




