(源码)STM32模拟SPI实现不同工作模式的问题
本帖最后由 xiajintaord 于 2018-8-10 15:12 编辑现在做的一个项目,由于成本原因,选用的芯片的SPI数量不够实现产品的功能,所以需要一个软件模拟的 SPI;
今天上午参考论坛里的帖子实现了 SPI 工作模式0 的代码,测试通过了(说明IO配置没有问题)。现在在调试工作模式1的代码,无法通讯,时序始终不对,代码帖出来,大家看看。
现在的问题就是工作模式1的时序怎么实现了。
补充一下:用的 keil 开发的寄存器版本,上传的代码格式有问题,上图片看吧。#include <stm32l1xx.h>
#define SPI_SCLK_SET {GPIOB->BSRRL=0x00000040;} //PB6
#define SPI_SCLK_CLR {GPIOB->BSRRH=0x00000040;}
#define SPI_MOSI_SET {GPIOB->BSRRL=0x00000080;} //PB7
#define SPI_MOSI_CLR {GPIOB->BSRRH=0x00000080;}
#define SPI_MISO_DAT (GPIOB->IDR&0x00000008) //PB3
void SPI_Delay(uint16 n)
{
n<<=4;
while(n--);
}
结贴:
00 01工作模式的模拟 SPI 已经调试完成了,都在下面的附件里面;
大家基本上用的都是硬件的 SPI,但有时候受限于成本,硬件资源不足的情况下,像 IIC 一样软件模拟的 SPI 也是一个不错的选择啊。
仅仅是修改部分代码,主要是针对 SCLK 时序,要理解 SPI 在不同的工作模式下的数据收发时序;
本帖最后由 xiajintaord 于 2018-8-10 15:15 编辑
toofree 发表于 2018-8-10 14:20
不知道你的IO读写是怎么来的。
请参考IO模拟I2C的代码,如下:
感谢回复。
说明一下,我这个是用的 L1 系列,BSRR 寄存器可以分别向 BSRRH、BSRRL 写1进行清零或者置位对应的 IO 口,另外,上面工作模式 0 的代码已经测试通过了,说明 IO 配置是 OK 的。
现在的问题是,工作模式 1 的时序没模拟出来,正在用示波器调试,还需要改改程序逻辑
不知道你的IO读写是怎么来的。
请参考IO模拟I2C的代码,如下:
#define SCL_H GPIOB->BSRR = GPIO_Pin_6
#define SCL_L GPIOB->BRR= GPIO_Pin_6
#define SDA_H GPIOB->BSRR = GPIO_Pin_7
#define SDA_L GPIOB->BRR= GPIO_Pin_7
#define SCL_read GPIOB->IDR& GPIO_Pin_6
#define SDA_read GPIOB->IDR& GPIO_Pin_7
toofree 发表于 2018-8-10 14:20
不知道你的IO读写是怎么来的。
请参考IO模拟I2C的代码,如下:
这个代码是如何配置IIC的SDA端口方向的?? select326 发表于 2018-8-10 15:12
这个代码是如何配置IIC的SDA端口方向的??
像这种一般都会在程序初始化的时候配置输入输出模式的,这里指关心 IO 的输入输出寄存器的值 xiajintaord 发表于 2018-8-10 14:54
感谢回复。
说明一下,我这个是用的 L1 系列,BSRR 寄存器可以分别向 BSRRH、BSRRL 写1进行清零或者置位 ...
不清楚你说的模式0是什么?官方没有这种叫法。
只有master mode、Slave mode、TI mode、BIDIMODE=1、BIDIMODE=0
既然模式0通过,那么模式1也应该能通过的。好好抠一下协议 可以问一下啥编辑软件嘛这个配色很舒服 dengdenghui 发表于 2018-8-10 15:35
可以问一下啥编辑软件嘛这个配色很舒服
http://www.sublimetext.com/ 问题还未解决,在‘摸索中,’先记一下,解决了再来结贴总结吧。 你的设备没有CS这个引脚吗,SPI做一主多从还是很容易的
页:
[1]
2