資源簡介
通過兩個單片機之間使用spi實現數據的傳輸,通過led燈的亮滅情況判斷數據是否正確傳輸

代碼片段和文件信息
/********************?2011電子科技協會?********************
;名稱?:SPI通信
;作者???:?鄭品洪
;日期???:?07/25/2011
;描述?:?;利用SPI實現兩單片機通信,需用杜邦線將兩單片機的MOSI,MISO,SPI_CLK
???????????互相連接起來,另外將主機的P3^7(PE0)和從機的SPI_NSS連接起來,另外,開發板
??93c46(即矩陣鍵盤旁邊靠里的芯片)會影響SPI通信,使用時請把主機中的93c46
拔去
;***********************************************************/
#include??
#define?uchar?unsigned?char?
#define?uint?unsigned?int
_Bool?MOSI?@PC_ODR:6;
_Bool?MISO?@PC_ODR:7;
_Bool?SPI_CLK?@PC_ODR:5;
_Bool?SPI_NSS?@PE_ODR:0;
uchar?table[]={0xc00xf90xa40xb00x990x920x820xf80x800x900x880x830xc60xa10x860x8e};
uchar?atbnc;
uchar?HL;
void?delay(uint?s)
{
?uchar?i;
?for(s;s>0;s--)
???for(i=0;i<100;i++);
}
void?init_IO(void)
{
????PB_DDR=0XFF;
????PB_CR1=0XFF;
????PB_CR2=0X00;
????
????PC_DDR=0X6f;????????//MISO,主設備懸空輸入,MOSI主設備推挽輸出,SCL推挽輸出
????PC_CR1=0X6f;
????PC_CR2=0X00;
????
PD_DDR=0x58;
PD_CR1=0x38;
PD_CR2=0x00;?
????PE_DDR=0x01;??????//PE0為從設備控制引腳,NSS設為上拉輸入
PE_CR1=0x21;
PE_CR2=0x00;
}
void?init_TIM2(void)
{
????TIM2_EGR=0X01;???????//允許產生更新事件
????TIM2_PSCR=0X00;?????//不分頻,使頻率為2MHz
????????
????TIM2_ARRH=0X27;?????//更新后計數器的值,定時5ms
????TIM2_ARRL=0X10;
????????
????TIM2_CR1=0X05;??????//允許定時器工作
????TIM2_IER=0X01;??????//允許更新中斷
_asm(“rim“);???????//匯編語句,啟動定時器
}
void?init_UART(void)
{
????UART2_BRR2?=?0x00;?????????//?波特率9600,分頻系數=2000000/9600=208
?UART2_BRR1?=?0x0d;??????????????//?對應的十六進制數為00D0,BBR1=0DBBR2=00
???UART2_CR2?=?0x2C;?????????//?b3?=?1允許發送????b2?=?1允許接收????b5?=?1允許產生接收中斷?
}
void?SPI(void)
{
SPI_CR1=0x14;?????????????????????//先發送MSB,關閉SPI,波特率f/4?,配置為主設備,空閑低電平,第一個時鐘邊緣開始數據采樣
SPI_NSS=0;???????????????????????//開啟從設備接收
SPI_CR1|=0x40;???????????????????//開啟SPI
SPI_CR2=0x00;? //雙向數據模式
a=0x18;
PD_DDR|=a;
????PD_CR1|=a;
delay(1000);
SPI_DR=a;??????????????????? //將要發送的a放到SPI_DR中
delay(1);??????????????????????//延時一會等待數據發送完畢
while((SPI_SR|0x80)==0x80);????//等待通信結束
if((SPI_SR&0x01)==0x01)?????????//判斷接受區是否為空,即判斷是否接收到數據
{c=SPI_DR;
???if(c==0x55)?
???PD_DDR=0x48;
????PD_CR1=0x28;
?
}????????????????????//將接受到從設備發送的數據賦值給b
delay(1000);???????????????????????//延時一會等待數據賦值完成
while((SPI_SR|0x80)==0x80);????//等待通信結束
SPI_NSS=1;????????????????????//關閉從設備接收
SPI_CR1|=0xbf;????????????????//關閉SPI?
delay(1);?
}
void?display(void)
{
H=b/16;
L=b%16;?
if((t%2)==0)
{
????PC_ODR=0x02;
????PB_ODR=table[H];
}
????
if((t%2)!=0)
{
????PC_ODR=0x00;
????PB_ODR=table[L];
}
}
void?main()
{
init_IO();
init_UART();
init_TIM2();
????while(1)
??{
????SPI();
display();
}
}
?@far?@interrupt?void?UART2_Receiver(void)
{
??while((UART2_SR?&?0x80)?==?0x00);????//?等待數據轉移到移位寄存器
??a=UART2_DR;?????????????????????????//?將接收到的字符放到a中
}
@far?@interrupt?void?TIM2_UP_IRQHandler?(void)?????????
{
???TIM2_SR1?=?0x00;?
?????t++;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????17802??2012-03-18?19:46??SPI1\123.wed
?????文件????????321??2012-03-18?19:46??SPI1\主\checkres.spy
?????文件??????12961??2014-12-15?16:38??SPI1\主\Debug\main.ls
?????文件??????18949??2014-12-15?16:38??SPI1\主\Debug\main.o
?????文件??????16176??2014-12-15?16:38??SPI1\主\Debug\spi.elf
?????文件???????1372??2014-12-15?16:38??SPI1\主\Debug\spi.hex
?????文件???????2288??2012-03-18?19:46??SPI1\主\Debug\spi.lkf
?????文件??????21627??2014-12-15?16:38??SPI1\主\Debug\spi.map
?????文件??????18906??2014-12-15?16:38??SPI1\主\Debug\spi.sm8
?????文件???????5510??2014-12-04?22:15??SPI1\主\Debug\stm8_interrupt_vector.ls
?????文件???????2660??2014-12-04?22:15??SPI1\主\Debug\stm8_interrupt_vector.o
?????文件???????3302??2014-12-15?16:38??SPI1\主\main.c
?????文件???????2292??2012-03-18?19:46??SPI1\主\Release\spi.lkf
?????文件????????370??2014-12-15?16:39??SPI1\主\spi.dep
?????文件????????896??2014-12-15?16:38??SPI1\主\spi.pdb
?????文件??????12633??2014-12-04?22:27??SPI1\主\spi.stp
?????文件????????195??2014-12-15?16:39??SPI1\主\SPI.stw
?????文件??????33757??2014-12-15?16:38??SPI1\主\SPI.wdb
?????文件??????33130??2014-12-15?16:39??SPI1\主\SPI.wed
?????文件???????2058??2012-03-18?19:46??SPI1\主\stm8_interrupt_vector.c
?????文件?????105769??2014-12-14?12:19??SPI1\主\__Previews\main.cPreview
?????文件??????10749??2014-12-15?16:40??SPI1\從\Debug\main.ls
?????文件??????17982??2014-12-15?16:40??SPI1\從\Debug\main.o
?????文件??????15928??2014-12-15?16:40??SPI1\從\Debug\spi.elf
?????文件???????1265??2014-12-15?16:40??SPI1\從\Debug\spi.hex
?????文件???????2288??2012-03-18?19:46??SPI1\從\Debug\spi.lkf
?????文件??????21168??2014-12-15?16:40??SPI1\從\Debug\spi.map
?????文件??????18034??2014-12-15?16:40??SPI1\從\Debug\spi.sm8
?????文件???????5471??2014-12-04?23:15??SPI1\從\Debug\stm8_interrupt_vector.ls
?????文件???????2642??2014-12-04?23:15??SPI1\從\Debug\stm8_interrupt_vector.o
............此處省略20個文件信息
- 上一篇:SVPWM算法詳解_已標注重點_
- 下一篇:企業網絡設計實訓報告
評論
共有 條評論