『 Jack_a_Lent_Notes』---SPI[ATmega128] ②

来源:互联网 发布:java sock5 编辑:程序博客网 时间:2024/05/19 22:26



模式0主机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式0 主机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>#define SPI_EN(PORTB&=0XFE)#define SPI_DI(PORTB|=0X01)const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void SPI_MasterInit(void){/* 设置 CS,SCK,MOSI 为输出,MISO 为输入 *///DDRB = (1<<PB2)|(1<<PB1);DDRB  = 0B00000111;PORTB = 0XFF;/* 使能 SPI 主机模式,模式0,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);}void SPI_MasterTransmit(unsigned char cData){SPI_EN;SPDR=cData;/* 启动数据传输 */while(!(SPSR&(1<<SPIF)));/* 等待传输结束 */SPI_DI;}int main(void){unsigned char i;PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_MasterInit();  while(1) {   for(i=0;i<17;i++){   PORTF=TAB1[i];   SPI_MasterTransmit(TAB1[i]);   _delay_ms(500);} }}


模式0从机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式0 从机   ******************************************************************************  */  #define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void  SPI_SlaveInit(void){/* 设置 MISO 为输出,其他为输入 */DDRB = (1<<PB3);/* 使能 SPI 从机模式,模式0,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<SPR0);}unsigned char SPI_SlaveReceive( void){while(!(SPSR&(1<<SPIF))) ;/* 等待接收结束 */return SPDR;}int main(void){PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_SlaveInit(); while(1) {PORTF=SPI_SlaveReceive(); }}



模式1主机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式1 主机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>#define SPI_EN(PORTB&=0XFE)#define SPI_DI(PORTB|=0X01)const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void SPI_MasterInit(void){/* 设置 CS,SCK,MOSI 为输出,MISO 为输入 *///DDRB = (1<<PB2)|(1<<PB1);DDRB  = 0B00000111;PORTB = 0XFF;/* 使能 SPI 主机模式,模式1,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR0);}void SPI_MasterTransmit(unsigned char cData){SPI_EN;SPDR=cData;/* 启动数据传输 */while(!(SPSR&(1<<SPIF)));/* 等待传输结束 */SPI_DI;}int main(void){unsigned char i;PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_MasterInit(); while(1) {   for(i=0;i<17;i++){   PORTF=TAB1[i];   SPI_MasterTransmit(TAB1[i]);   _delay_ms(500);} }}


模式1从机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式1 从机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void  SPI_SlaveInit(void){/* 设置 MISO 为输出,其他为输入 */DDRB = (1<<PB3);/* 使能 SPI 从机模式,模式1,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<CPHA)|(1<<SPR0);}unsigned char SPI_SlaveReceive( void){while(!(SPSR&(1<<SPIF))) ;/* 等待接收结束 */return SPDR;}int main(void){PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_SlaveInit(); while(1) {PORTF=SPI_SlaveReceive(); }}



模式2主机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式2 主机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>#define SPI_EN(PORTB&=0XFE)#define SPI_DI(PORTB|=0X01)const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void SPI_MasterInit(void){/* 设置 CS,SCK,MOSI 为输出,MISO 为输入 *///DDRB = (1<<PB2)|(1<<PB1);DDRB  = 0B00000111;PORTB = 0XFF;/* 使能 SPI 主机模式,模式2,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<SPR0);}void SPI_MasterTransmit(unsigned char cData){SPI_EN;SPDR=cData;/* 启动数据传输 */while(!(SPSR&(1<<SPIF)));/* 等待传输结束 */SPI_DI;}int main(void){unsigned char i;PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_MasterInit(); while(1) {   for(i=0;i<17;i++){   PORTF=TAB1[i];   SPI_MasterTransmit(TAB1[i]);   _delay_ms(500);} }}


模式2从机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式2 从机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void  SPI_SlaveInit(void){/* 设置 MISO 为输出,其他为输入 */DDRB = (1<<PB3);/* 使能 SPI 从机模式,模式2,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<CPOL)|(1<<SPR0);}unsigned char SPI_SlaveReceive( void){while(!(SPSR&(1<<SPIF))) ;/* 等待接收结束 */return SPDR;}int main(void){PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_SlaveInit();  while(1) {PORTF=SPI_SlaveReceive(); }}



模式3主机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式3 主机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>#define SPI_EN(PORTB&=0XFE)#define SPI_DI(PORTB|=0X01)const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void SPI_MasterInit(void){/* 设置 CS,SCK,MOSI 为输出,MISO 为输入 *///DDRB = (1<<PB2)|(1<<PB1);DDRB  = 0B00000111;PORTB = 0XFF;/* 使能 SPI 主机模式,模式3,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)| (1<<SPR0);}void SPI_MasterTransmit(unsigned char cData){SPI_EN;SPDR=cData;/* 启动数据传输 */while(!(SPSR&(1<<SPIF)));/* 等待传输结束 */SPI_DI;}int main(void){unsigned char i;PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_MasterInit(); while(1) {   for(i=0;i<17;i++){   PORTF=TAB1[i];   SPI_MasterTransmit(TAB1[i]);   _delay_ms(500);} }}


模式3从机代码

/**  ******************************************************************************  * 文       件: main.c  * 版       本: v1  * 编 译 环 境: Atmel Studio 6.0  * 目 标 芯 片: ATmega128  * 晶       振: 16MHz  * 创 建 时 间: 2016-2-1  * 描       述: SPI模式3 从机   ******************************************************************************  */#define  F_CPU 16000000UL#include <avr/io.h>#include<util/delay.h>const unsigned char   TAB1[]=//seg共阴{ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0X00};void  SPI_SlaveInit(void){/* 设置 MISO 为输出,其他为输入 */DDRB = (1<<PB3);/* 使能 SPI 从机模式,模式3,设置时钟速率为 fck/16 */SPCR = (1<<SPE)|(1<<CPOL)|(1<<CPHA)|(1<<SPR0);}unsigned char SPI_SlaveReceive( void){while(!(SPSR&(1<<SPIF))) ;/* 等待接收结束 */return SPDR;}int main(void){PORTF=0X00;//共阴数码管关显示 DDRF=0XFF;SPI_SlaveInit(); while(1) {PORTF=SPI_SlaveReceive(); }}
相关寄存器

===========================================================================================================SPI 控制寄存器- SPCR SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0Bit 7 – SPIE: SPI 中断使能置位后,只要 SPSR 寄存器的 SPIF 和 SREG 寄存器的全局中断使能位置位,就会引发SPI 中断。Bit 6 – SPE: SPI 使能SPE 置位将使能 SPI。Bit 5 – DORD: 数据次序DORD 置位时数据的 LSB 首先发送;否则数据的 MSB 首先发送。Bit 4 – MSTR: 主 / 从选择MSTR 置位时选择主机模式,否则为从机。如果 MSTR 为 ’1’,SS 配置为输入,但被拉低,则 MSTR 被清零,寄存器 SPSR 的 SPIF 置位。用户必须重新设置 MSTR 进入主机模式。Bit 3 – CPOL: 时钟极性CPOL为高表示空闲时SCK为高电平;否则,表示空闲时SCK为低电平。Bit 2 – CPHA: 时钟相位CPHA 决定数据是在 SCK 的起始沿采样还是在 SCK 的结束沿采样。Bits 1, 0 – SPR1, SPR0: SPI 时钟速率选择 1 和 0确定主机的 SCK 速率。 SPR1 和 SPR0 对从机没有影响。=============================================================================================================SPI 状态寄存器- SPSRSPIF WCOL – – – – – SPI2X Bit 7 – SPIF: SPI 中断标志串行发送结束后,SPIF 置位。若此时寄存器 SPCR 的 SPIE 和全局中断使能位置位,SPI中断即产生。如果 SPI 为主机, SS 配置为输入,且被拉低, SPIF 也将置位。进入中断例程后 SPIF 自动清零。或者可以通过先读 SPSR,紧接着访问 SPDR 来对 SPIF 清零。Bit 6 – WCOL: 写冲突标志在发送当中对 SPI 数据寄存器 SPDR 写数据将置位 WCOL。 WCOL 可以通过先读 SPSR,紧接着访问 SPDR 来清零。Bit 5..1 – Res: 保留保留位,读操作返回值为零。Bit 0 – SPI2X:SPI 倍速置位后 SPI 的速度加倍。若为主机,则 SCK 频率可达 CPU 频率的一半。若为从机,只能保证 fosc /4。=============================================================================================================SPI 数据寄存器- SPDRMSB LSB SPI 数据寄存器为读/写寄存器,用来在寄存器文件和SPI移位寄存器之间传输数据。写寄存器将启动数据传输,读寄存器将读取寄存器的接收缓冲器。==========================================================================================================================================================================================================================SPI 模式 |   CPOL    | CPHA     |      起始沿   |      结束沿     |  -------------------------------------------------------------------------------------------------------------    0    | CPOL = 0  | CPHA = 0 | 采样 ( 上升沿 ) | 设置 ( 下降沿 ) |-------------------------------------------------------------------------------------------------------------    1    | CPOL = 0  | CPHA = 1 | 设置 ( 上升沿 ) | 采样 ( 下降沿 ) |-------------------------------------------------------------------------------------------------------------    2    | CPOL = 1  | CPHA = 0 | 采样 ( 下降沿 ) | 设置 ( 上升沿 ) |-------------------------------------------------------------------------------------------------------------    3    | CPOL = 1  | CPHA = 1 | 设置 ( 下降沿 ) | 采样 ( 上升沿 ) |=============================================================================================================CPOL 为高表示空闲时 SCK 为高电平;CPOL 为低表示空闲时 SCK 为低电平。CPHA 为高表示在 SCK 的起始沿采样;CPHA 为低表示在 SCK 的结束沿采样。



本人在此发布的博文(包括但不限于汉字、拼音、阿拉伯字母、图片、影像,以及前述之各种任意组合等等)均为互联网整理而来,仅供学习参考,如果侵犯了你的权益请发送电子邮件联系我,我会尽快处理你的问题。



0 0
原创粉丝点击