一.SPI硬件原理
- 单主单从的连接方式
如果只有一个从机器件,SS片选型号线,直接接地。 - 单主多从连接模式
二.SPI四种模式
图中以CPOL/CPHA = 1 ,举例 总线空闲状态为高电平,代表第一个时钟沿为下降沿,数据输出在一个时钟周期的第一个沿。== 数据采样==在第二个沿。 当CPHA = 0时,表示数据的采样是在一个时钟周期的第一个沿。 数据输出:总机往从机上写数据 数据采样:从机开始读取数据
三.25AA02A的应用
EEPROM包括了一个8位的指令寄存器,可通过sI访问,并在SCK上升沿移入数据,执行此操作时,CS引脚必须保持低电平,HOLD引脚必须保持高电平。 引脚DI:用作于输入数据信号,另一个作用是选择通道控制; 引脚DO:一般作用是输出数据信号,还可以用作转换数据的输出;
三.编程
bsp_spi.c
这里是从机器件手册,说明主机开始数据输入时(sck = 1),从机开始采样。
void spi_write_byte(unsigned char byte)
底层操作,不涉及器件
{
unsigned char i;
for (i=0;i<8;i++)
{
sck = 0;
if((dat & 0x80) == 0x80)
{
DI = 1;
}
else
{
DI = 0;
}
dat = dat << 1;
sck = 1;
}
}
这里是从机器件手册,说明从机开始数据输出时(sck = 1),主机开始采样。
void spi_read_byte()
{
unsigned char i;
unsigned char dat;
dat <<= 1;
for (i=0;i<8;i++)
{
sck = 0;
sck = 1;
if((D0 == 1)
{
dat |= 0x01;
}
else
{
dat &= ~0x01;
}
return dat;
}
msp_25AA020A.c
unsigned char 25AA020A_read(unsigned char addr)
{
unsigned char dat;
CS = 0 ;
spi_read_byte(25AA020A_READ);
spi_read_byte(addr);
dat = spi_read_byte();
CS = 1 ;
return dat;
写使能 ,控制CS拉低。然后写指令。#define 25AA020A_WREN 0x06
unsigned char 25AA020A_write(unsigned char addr,unsigned char dat)
{
unsigned char state;
25AA020A_write_enable();
CS = 0 ;
spi_write_byte(25AA020A_WRITE);
spi_write_byte(addr);
spi_write_byte(dat);
while(1);
{
CS = 0;
spi_write_byte(25AA020A_RDSR );
state = spi_read_byte();
if((state &=0x01) == 0)
{
break;
}
CS = 1;
}
CS = 1 ;
}
msp_25AA020A.h
#define 25AA020A_READ 0x03;
#define 25AA020A_WRITE 0x02;
#define 25AA020A_WREN 0x06;
#define 25AA020A_WRDI 0x04;
#define 25AA020A_RDSR 0x05;
#define 25AA020A_WRSR 0x01;
|