硬件SPI 对应的3个函数:
- void SPI_Init(void) //初始化
- {
- P_SW1 &= 0XF3; //1111 0011 P_SW1功能寄存器,引脚切换选择 B3B2位决定4种引脚配置
- P_SW1 |= 0X04; //0000 0100 我们要选P22P23P24P25,先要把B3B2清零,才能改写为01
- //清零用P_SW1 &= 1111 0011 B3B2改写为01:P_SW1 |= 0000 0100
-
- SPCTL = 0X90; //SPI控制寄存器SPCTL,SPCTL是最核心的模式配置,第一位取1:忽略引脚功能,
- //使用MSTR确定器件是主机还是从机,第二位是使能位,第三位DORD:SPI数据位发
- //送/接收的顺序,0:先发送/接收数据的高位(MSB)1:先发送/接收数据的低
- //位(LSB).第四位MSTR:器件主/从模式选择位:设置主机模式
- //若 SSIG=0,则 SS 管脚必须为高电平且设置 MSTR 为1若 SSIG=1,则只需要设置
- //MSTR 为 1(忽略 SS 管脚的电平)设置从机模式:
- //若 SSIG=0,则 SS 管脚必须为低电平(与 MSTR 位无关)若 SSIG=1,则只需要设
- //置 MSTR 为 0(忽略 SS 管脚的电平)第3位CPOL设置时钟极性和时钟相位控制
- //CPOL:SPI 时钟极性控制,0:SCLK 空闲时为低电平,SCLK 的前时钟沿为上升沿,
- //后时钟沿为下降沿1:SCLK 空闲时为高电平,SCLK 的前时钟沿为下降沿,后时钟沿
- //为上升沿 第2位CPHA:SPI 时钟相位控制,0:数据 SS 管脚为低电平驱动第一位数
- //据并在 SCLK 的后时钟沿改变数据,前时钟沿采样数据(必须SSIG=0),1:数据在
- //SCLK 的前时钟沿驱动,后时钟沿采样.最后1和0位是时钟频率选择
-
-
- SPCTL |= 0X40; //只有1个存储芯片,配主从模式,第一位和第四位取1,先不使能,MSB方式读取:得
- //0x90,配置完成,最后再使能SPI:SPCTL |= 0X40(第二位置1)
-
- SCLK = 0; //时钟引脚初始化spi模式0,sclk初始化为低电平
-
- SPIF = 1; //SPSTAT是状态寄存器,SPIF清空标志位要置1。当发送/接收完成 1 字节的数据后,
- //硬件自动将此位置 1,并向 CPU 提出中断请求。当 SSIG 位被设置为0 时,由于
- //SS管脚电平的变化而使得设备的主/从模式发生改变时,此标志位也会被硬件自动
- //置1,以标志设备模式发生变化。注意:此标志位必须用户通过软件方式向此位写
- //1 进行清零。SPIF不等于0,发送/接受就结束了,SPIF读到0表示正在读写,读到
- //1表示完成
- WCOL = 1; //WCOL:SPI写冲突标志位。当SPI在进行数据传输的过程中写SPDAT寄存器时,硬件
- //将此位置1.注意:此标志位必须用户通过软件方式向此位写 1 进行清零。
- //读取和写入完成之后都要清空SPIF和WCOL(置1)
- }
-
-
- void SPI_WriteByte(u8 dat) //写入一个字节
- {
- SPDAT = dat; //SPI 数据寄存器(SPDAT),SPI 发送/接收数据缓冲器。
- while(SPIF == 0);
- SPIF = 1; //每次读取写入完成后都要清空状态寄存器标志位
- WCOL = 1; //每次读取写入完成后都要清空状态寄存器标志位
- }
-
-
- u8 SPI_ReadByte(void) //读取一个字节
- {
- SPDAT = 0XFF; //SPI 数据寄存器(SPDAT),SPI 发送/接收数据缓冲器。
- //这里发送一个字节,主要是为了产生8位时钟脉冲,没有脉冲无法读数据
- while(SPIF == 0);
- SPIF = 1; //每次读取写入完成后都要清空状态寄存器标志位
- WCOL = 1; //每次读取写入完成后都要清空状态寄存器标志位
- return SPDAT;
- }
复制代码
我已经注释的很详细了,方便以后查看..............
|