两块arm板板件spi通信实例

来源:互联网 发布:bbc 6分钟英语 知乎 编辑:程序博客网 时间:2024/04/28 14:59

1.我用的两块板子都是tm4c123gxl ,cortex M4内核。两块板子一块用作主设备,一块用作从设备。连接时,主从设备的 sck,fss对应相连。主设备tx接从设备rx。

主设备代码如下:

//*****************************************************************************////*****************************************************************************#include <stdint.h>#include <stdbool.h>#include "inc/hw_memmap.h"#include "inc/hw_types.h"#include "driverlib/debug.h"#include "driverlib/fpu.h"#include "driverlib/ssi.h"#include "driverlib/gpio.h"#include "driverlib/pin_map.h"#include "driverlib/rom.h"#include "driverlib/sysctl.h"#include "driverlib/uart.h"#include "utils/uartstdio.h"#ifdef DEBUGvoid__error__(char *pcFilename, uint32_t ui32Line){}#endif#define NUM_SSI_DATA            3//*****************************************************************************//// Configure the UART and its pins.  This must be called before UARTprintf().////*****************************************************************************voidConfigureUART(void){    //    // Enable the GPIO Peripheral used by the UART.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);    //    // Enable UART0    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);    //    // Configure GPIO Pins for UART mode.    //    GPIOPinConfigure(GPIO_PA0_U0RX);    GPIOPinConfigure(GPIO_PA1_U0TX);    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);    //    // Use the internal 16MHz oscillator as the UART clock source.    //    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);    //    // Initialize the UART for console I/O.    //    UARTStdioConfig(0, 115200, 16000000);}//*****************************************************************************//// Print "Hello World!" to the UART on the evaluation board.////*****************************************************************************intmain(void){    //volatile uint32_t ui32Loop;    //  uint32_t pui32DataTx[NUM_SSI_DATA];    uint32_t pui32DataRx[NUM_SSI_DATA];    uint32_t ui32Index;    // Enable lazy stacking for interrupt handlers.  This allows floating-point    // instructions to be used within interrupt handlers, but at the expense of    // extra stack usage.    //    FPULazyStackingEnable();    //    // Set the clocking to run directly from the crystal.    //    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |                       SYSCTL_OSC_MAIN);    //    // Enable the GPIO port that is used for the on-board LED.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);    //    // Enable the GPIO pins for the LED (PF2 & PF3).    //    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);         //    // Initialize the UART.    //      ConfigureUART();    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);    //    // For this example SSI0 is used with PortA[5:2].  The actual port and    // pins used may be different on your part, consult the data sheet for    // more information.  GPIO port A needs to be enabled so these pins can    // be used.    // TODO: change this to whichever GPIO port you are using.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);    //    // Configure the pin muxing for SSI0 functions on port A2, A3, A4, and A5.    // This step is not necessary if your part does not support pin muxing.    // TODO: change this to select the port/pin you are using.    //    GPIOPinConfigure(GPIO_PA2_SSI0CLK);    GPIOPinConfigure(GPIO_PA3_SSI0FSS);    GPIOPinConfigure(GPIO_PA4_SSI0RX);    GPIOPinConfigure(GPIO_PA5_SSI0TX);    //    // Configure the GPIO settings for the SSI pins.  This function also gives    // control of these pins to the SSI hardware.  Consult the data sheet to    // see which functions are allocated per pin.    // The pins are assigned as follows:    //      PA5 - SSI0Tx    //      PA4 - SSI0Rx    //      PA3 - SSI0Fss    //      PA2 - SSI0CLK    // TODO: change this to select the port/pin you are using.    //    GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |                   GPIO_PIN_2);    //    // Configure and enable the SSI port for TI master mode.  Use SSI0, system    // clock supply, master mode, 1MHz SSI frequency, and 8-bit data.    //    SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_TI,                       SSI_MODE_MASTER, 1000000, 8);    //    // Enable the SSI0 module.    //    SSIEnable(SSI0_BASE);    //    // Read any residual data from the SSI port.  This makes sure the receive    // FIFOs are empty, so we don't read any unwanted junk.  This is done here    // because the TI SSI mode is full-duplex, which allows you to send and    // receive at the same time.  The SSIDataGetNonBlocking function returns    // "true" when data was returned, and "false" when no data was returned.    // The "non-blocking" function checks if there is any data in the receive    // FIFO and does not "hang" if there isn't.    //    while(SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[0]))    {    }    UARTprintf("......................\n\n");    //    // Initialize the data to send.    //    pui32DataTx[0] = 'n';    pui32DataTx[1] = 'm';    pui32DataTx[2] = 'b';    //    // Display indication that the SSI is transmitting data.    //   UARTprintf("Sent:\n  ");    //    // Send 3 bytes of data.    //    for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)    {        //        // Display the data that SSI is transferring.        //        UARTprintf("'%c' ", pui32DataTx[ui32Index]);        //        // Send the data using the "blocking" put function.  This function        // will wait until there is room in the send FIFO before returning.        // This allows you to assure that all the data you send makes it into        // the send FIFO.        //        SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]);    }           UARTprintf("\nSend Success!\n  ");                             //     while(1)    {        //        // Turn on the BLUE LED.        //        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);        //        // Delay for a bit.        //        SysCtlDelay(SysCtlClockGet() / 10 / 3);        //        // Turn off the BLUE LED.        //        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);                         //        // Delay for a bit.        //        SysCtlDelay(SysCtlClockGet() / 10 / 3);    }   }


从设备上代码:


//*****************************************************************************////*****************************************************************************#include <stdint.h>#include <stdbool.h>#include "inc/hw_memmap.h"#include "inc/hw_types.h"#include "driverlib/debug.h"#include "driverlib/fpu.h"#include "driverlib/ssi.h"#include "driverlib/gpio.h"#include "driverlib/pin_map.h"#include "driverlib/rom.h"#include "driverlib/sysctl.h"#include "driverlib/uart.h"#include "utils/uartstdio.h"#ifdef DEBUGvoid__error__(char *pcFilename, uint32_t ui32Line){}#endif#define NUM_SSI_DATA            3//*****************************************************************************//// Configure the UART and its pins.  This must be called before UARTprintf().////*****************************************************************************voidConfigureUART(void){    //    // Enable the GPIO Peripheral used by the UART.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);    //    // Enable UART0    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);    //    // Configure GPIO Pins for UART mode.    //    GPIOPinConfigure(GPIO_PA0_U0RX);    GPIOPinConfigure(GPIO_PA1_U0TX);    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);    //    // Use the internal 16MHz oscillator as the UART clock source.    //    UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);    //    // Initialize the UART for console I/O.    //    UARTStdioConfig(0, 115200, 16000000);}//*****************************************************************************//// Print "Hello World!" to the UART on the evaluation board.////*****************************************************************************intmain(void){    //volatile uint32_t ui32Loop;    //  uint32_t pui32DataTx[NUM_SSI_DATA];    uint32_t pui32DataRx[NUM_SSI_DATA];    uint32_t ui32Index;    // Enable lazy stacking for interrupt handlers.  This allows floating-point    // instructions to be used within interrupt handlers, but at the expense of    // extra stack usage.    //    FPULazyStackingEnable();    //    // Set the clocking to run directly from the crystal.    //    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |                       SYSCTL_OSC_MAIN);    //    // Enable the GPIO port that is used for the on-board LED.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);    //    // Enable the GPIO pins for the LED (PF2 & PF3).    //    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);         //    // Initialize the UART.    //      ConfigureUART();    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);    //    // For this example SSI0 is used with PortA[5:2].  The actual port and    // pins used may be different on your part, consult the data sheet for    // more information.  GPIO port A needs to be enabled so these pins can    // be used.    // TODO: change this to whichever GPIO port you are using.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);    //    // Configure the pin muxing for SSI0 functions on port A2, A3, A4, and A5.    // This step is not necessary if your part does not support pin muxing.    // TODO: change this to select the port/pin you are using.    //    GPIOPinConfigure(GPIO_PA2_SSI0CLK);    GPIOPinConfigure(GPIO_PA3_SSI0FSS);    GPIOPinConfigure(GPIO_PA4_SSI0RX);    GPIOPinConfigure(GPIO_PA5_SSI0TX);    //    // Configure the GPIO settings for the SSI pins.  This function also gives    // control of these pins to the SSI hardware.  Consult the data sheet to    // see which functions are allocated per pin.    // The pins are assigned as follows:    //      PA5 - SSI0Tx    //      PA4 - SSI0Rx    //      PA3 - SSI0Fss    //      PA2 - SSI0CLK    // TODO: change this to select the port/pin you are using.    //    GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |                   GPIO_PIN_2);    //    // Configure and enable the SSI port for TI master mode.  Use SSI0, system    // clock supply, master mode, 1MHz SSI frequency, and 8-bit data.    //    SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_TI,                       SSI_MODE_SLAVE, 1000000, 8);    //    // Enable the SSI0 module.    //    SSIEnable(SSI0_BASE);    //    // Read any residual data from the SSI port.  This makes sure the receive    // FIFOs are empty, so we don't read any unwanted junk.  This is done here    // because the TI SSI mode is full-duplex, which allows you to send and    // receive at the same time.  The SSIDataGetNonBlocking function returns    // "true" when data was returned, and "false" when no data was returned.    // The "non-blocking" function checks if there is any data in the receive    // FIFO and does not "hang" if there isn't.    //    while(SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[0]))    {    }    UARTprintf("......................\n\n");UARTprintf("\nRead:\n  ");    while(SSIBusy(SSI0_BASE))    {    }       //    // Display indication that the SSI is receiving data.    //    //UARTprintf("\nReceived:\n  ");    //    // Receive 3 bytes of data.    //    for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++)    {        //        // Receive the data using the "blocking" Get function. This function        // will wait until there is data in the receive FIFO before returning.        //        SSIDataGet(SSI0_BASE, &pui32DataRx[ui32Index]);        //        // Since we are using 8-bit data, mask off the MSB.        //        pui32DataRx[ui32Index] &= 0x00FF;        //        // Display the data that SSI0 received.        //        UARTprintf("'%c' ", pui32DataRx[ui32Index]);    }          while(1)    {        //        // Turn on the BLUE LED.        //        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);        //        // Delay for a bit.        //        SysCtlDelay(SysCtlClockGet() / 10 / 3);        //        // Turn off the BLUE LED.        //        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);                         //        // Delay for a bit.        //        SysCtlDelay(SysCtlClockGet() / 10 / 3);    }   }


说明: SCK:      PA2

             FSS:      PA3

             RX:        PA4

             TX:         PA5

效果图:

             

0 0
原创粉丝点击