三、代碼實現
1、端口配置
實現 SPI0,SPI1 相關引腳的定義,以及模塊時鐘開啟,代碼如下:
- void spi_port_init(void)
- {
- SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTE_MASK;
- SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK | SIM_SCGC4_SPI1_MASK;
- PORTA_PCR16 &= ~PORT_PCR_MUX_MASK;
- PORTA_PCR16 |= PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK; //Use PTA16 as SPI0_MISO
- PORTA_PCR17 &= ~PORT_PCR_MUX_MASK;
- PORTA_PCR17 |= PORT_PCR_MUX(5)|PORT_PCR_DSE_MASK; //Use PTA17 as SPI0_MOSI
- PORTC_PCR5 &= ~PORT_PCR_MUX_MASK;
- PORTC_PCR5 |= PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTC5 as SPI0_sck
- PORTC_PCR4 &= ~PORT_PCR_MUX_MASK;
- PORTC_PCR4 = PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTC4 as SPI0_pcs
- PORTE_PCR1 &= ~PORT_PCR_MUX_MASK;
- PORTE_PCR1 |= PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTE1 as SPI1_MOSI
- PORTE_PCR3 &= ~PORT_PCR_MUX_MASK;
- PORTE_PCR3 |= PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTE3 as SPI1_MISO
- PORTE_PCR2 &= ~PORT_PCR_MUX_MASK;
- PORTE_PCR2 |= PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTE2 as SPI1_SCK
- PORTE_PCR4 &= ~PORT_PCR_MUX_MASK;
- PORTE_PCR4 = PORT_PCR_MUX(2)|PORT_PCR_DSE_MASK; //Use PTE4 as SPI1_SS_b
- }
復制代碼
2:模塊單線雙向配置
配置 SPI0 為主機,SPI1 為從機,兩個模塊均為單線雙向功能,初始配置為MOMI 引腳為主機輸出,SISO 引腳為從機輸入。模塊初始化代碼配置如下:
- void spi_module_init(void)
- {
- // ================SPI0 init master ==============
- SPI0_C1 &= ~SPI_C1_SPE_MASK ;
- SPI0_C1 = SPI_C1_MSTR_MASK | SPI_C1_SSOE_MASK ; //SPI0 主機
- SPI0_C1 &= (~SPI_C1_CPHA_MASK) & (~SPI_C1_CPOL_MASK) & (~SPI_C1_SPIE_MASK) & (~SPI_C1_SPTIE_MASK);
- SPI0_BR = (SPI_BR_SPPR(0x02) | SPI_BR_SPR(0x05)); // Set baud rate register 125Khz 波特率
- SPI0_C2 |= SPI_C2_MODFEN_MASK | SPI_C2_BIDIROE_MASK | SPI_C2_SPC0_MASK ; // 單線雙向模式,輸出
- //==================SPI1 init slave==============
- SPI1_C1 &= ~SPI_C1_SPE_MASK;
- SPI1_C1 |= SPI_C1_SSOE_MASK;// 從機
- SPI1_C1 &= (~SPI_C1_CPHA_MASK) & (~SPI_C1_CPOL_MASK) & (~SPI_C1_SPIE_MASK) & (~SPI_C1_SPTIE_MASK);
- SPI1_C2 |= SPI_C2_MODFEN_MASK | SPI_C2_SPC0_MASK;
- SPI1_C2 &= ~SPI_C2_BIDIROE_MASK; //從機單線輸入
- //==================Enable SPI0 and SPI1============
- SPI0_C1 |= SPI_C1_SPE_MASK ; // Enable SPI module
- SPI1_C1 |= SPI_C1_SPE_MASK; /* Enable device */
- }
復制代碼3:主控程序
- spi_port_init(); //相關引腳初始化
- spi_module_init(); // SPI 模塊初始化
- spi0_send8(0x0E); //主機發送 0X0E
- rd = spi0_get8();
- rd1 = spi1_get8(); //從機接收
- printf("SPI0_rd: %02x", rd&0xFF); //打印結果
- printf("SPI1_rd: %02x", rd1&0xFF);
- spi0_send8(0x1E); //主機發送 0X1E
- rd = spi0_get8();
- rd1 = spi1_get8(); //從機接收
- printf("SPI0_rd: %02x", rd&0xFF);
- printf("SPI1_rd: %02x", rd1&0xFF);
- global_pass_count = 0;
- //從機發送,主機接收
- SPI1_C2 |= SPI_C2_BIDIROE_MASK; //MISO is used in slave mode as I/O---output
- //set MOSI input
- SPI0_C2 &= ~SPI_C2_BIDIROE_MASK; //MOSI is used in master mode as input
- //從機發送從 1 開始遞加數據給主機,主機接收
- while(1)
- {
- global_pass_count++;
- while ((SPI1_S & SPI_S_SPTEF_MASK) == 0);
- SPI1_D = global_pass_count;
- rd=spi0_send_read(0xaa);
- printf("SPI0_rd: %02x", rd&0xFF);
- }
復制代碼
四,實驗結果
1,SPI 波形
波形見圖 3,其中 MOSI 即為 MOMI 以及 SISO 單數據線上面的波形。Clock 即為時鐘線,Enable 即為 PCS 片選信號線。從圖中可以看到,主從機之間的通信數據均在單數據線上。0X0E 及 0X1E 是 SPI0 作為主機發出的,后面的 0X01 開始的遞增數據均為 SPI1 作為從機發出的。
141906m287vo4j97jhv08j.jpg.thumb.jpg (28.25 KB, 下載次數: 66)
下載附件
2016-9-8 01:33 上傳
2,通信數據打印信息
142414hxueyr2o0hqhehoq.jpg.thumb.jpg (39.2 KB, 下載次數: 65)
下載附件
2016-9-8 01:33 上傳
圖 4 打印結果信息
從上圖中可以看到,SPI0 作為主機發出的 0X0E以及 0X1E 都能被 SPI1 從機接收到。 而 SPI1 作為從機發出的從 0X01 遞增的數據也均被 SPI0 作為主機接收到。
綜上,可以看到,SPI0 以及 SPI1 可以實現單線雙向功能的通信。