模拟SPI实现和调试流程
2017-10-08 10:53
176 查看
一般来说,所有的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; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
2、SPI调试的注意点
1)spi读取和发送数据前,等待数据稳定的延时是有必要添加的,否则,存在时钟在跳变的同时,数据也在跳变的情况,这个时候读回来的数据有可能不准确,可能是0或1。
2)根据器件的特性说明,设置读取的方式,高位在前还是低位在前,当然有些器件会在读取或者写入数据的时候,有些特殊的时序要求,这个就另作说法了,如SSD2828器件。
3)spi是否能够正常读写器件,最好的判断方法就是读取器件的id,可以循环去读取,测试是否能够正确返回id,如果不行则需结合示波器查看波形。
4)spi器件的复位管脚也非常重要,如果复位脚一直处于复位的状态,那么这个时候也是无法正确读写器件的
相关文章推荐
- 用GPIO模拟SPI协议的实现
- 用GPIO模拟SPI协议的实现[转]
- 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
- 用GPIO模拟SPI协议的实现
- 用GPIO模拟SPI协议的实现
- 基于Linux的S3C6410模拟SPI的外围设备驱动程序、Makefile及测试程序的实现
- 设计模式之二:观察者模式(简单实现(气象站模拟流程))
- 设计模式之六:命令模式(简单实现(餐厅点餐模拟流程))
- 用GPIO模拟SPI协议的实现
- 普通IO口模拟实现SPI通信及应用解析
- 微信小程序 + mock.js 实现后台模拟及调试
- 模拟i2c实现流程
- 阿里RAP+fiddler实现app原生应用的cgi数据mock----- (一)RAP+fiddler工具主流程部署调试
- 自动取款机流程模拟C语言的实现
- 用GPIO模拟SPI协议的实现
- 嵌入式学习--work11 关于SPI的深入学习及软件模拟SPI(LCD调试所遇)
- STM32 SPI 模拟实现 W25X16读写代码
- 蒙特卡洛树搜索(MCTS)进行模拟的实现流程
- Davinci GPIO模拟SPI的实现,dm644x,dm6446
- 用GPIO模拟SPI协议的实现