一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk、spi_cs、spi_mosi、spi_miso四个引脚的输入输出即可,具有很好的可移植性。
下面我以stm32为例,简单讲解一下模拟spi的实现和调试流程,实例中spi以上升沿来进行收发数据
1、首先先贴出代码
GPIO_Initure.Pin=SIMULATE_SPI_CS_PIN;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=SIMULATE_SPI_CLK_PIN;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=SIMULATE_SPI_MISO_PIN;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=SIMULATE_SPI_MOSI_PIN;
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;
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;
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;
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器件的复位管脚也非常重要,如果复位脚一直处于复位的状态,那么这个时候也是无法正确读写器件的