Test SPISlave \\ Current lib. does not work on STM32F446RE

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * Mbed Application program / Test SPI function
00003  *      Tested on Nucleo-F446RE
00004  *
00005  * Copyright (c) 2017 Kenji Arai / JH1PJL
00006  *  http://www.page.sannet.ne.jp/kenjia/index.html
00007  *  http://mbed.org/users/kenjiArai/
00008  *      Created:    November   7th, 2017
00009  *      Revised:    November  16th, 2017
00010  */
00011 
00012 /*
00013     --SPI1--
00014         SPI1_MOSI: PA_7  GPIO_AF5_SPI1
00015         SPI1_SCLK: PA_5  GPIO_AF5_SPI1
00016     --SPI2--
00017         SPI2_MOSI: PC_1  GPIO_AF7_SPI2
00018         SPI2_SCLK: PB_10 GPIO_AF5_SPI2
00019     --SPI3--
00020         SPI3_MOSI: PB_5  GPIO_AF6_SPI3
00021         SPI3_SCLK: PB_3  GPIO_AF6_SPI3
00022  
00023     --PortA--
00024         SPI1_MOSI: PA_7  GPIO_AF5_SPI1
00025         SPI1_SCLK: PA_5  GPIO_AF5_SPI1
00026     --PortB--
00027         SPI2_SCLK: PB_10 GPIO_AF5_SPI2
00028         SPI3_MOSI: PB_5  GPIO_AF6_SPI3
00029         SPI3_SCLK: PB_3  GPIO_AF6_SPI3
00030     --PortC--
00031         SPI2_MOSI: PC_1  GPIO_AF7_SPI2
00032  */
00033 
00034 /*
00035     wiring information
00036     connected PA7(D11),PC_1(A4) and PB_5(D4)
00037     connected PA5(D13),PB_10(D6) and PB_3(D3)
00038  */
00039 
00040 //  Include --------------------------------------------------------------------
00041 #include "mbed.h"
00042 
00043 //  Definition -----------------------------------------------------------------
00044 #define     DOES_NOT_WORK   1
00045 #define     WORKS_WELL      0
00046 
00047 #if (DOES_NOT_WORK + WORKS_WELL) != 1
00048 #error "Please set either DOES_NOT_WORK or WORKS_WELL to 1”
00049 #endif
00050 
00051 //  Constructor ----------------------------------------------------------------
00052 Serial      pc(USBTX, USBRX);
00053 SPISlave    spi_1(PA_7 , NC, PA_5,  NC);
00054 SPISlave    spi_2(PC_1 , NC, PB_10, NC);
00055 SPI         spi_3(PB_5 , NC, PB_3);
00056 
00057 //  RAM ------------------------------------------------------------------------
00058 
00059 //  ROM / Constant data --------------------------------------------------------
00060 
00061 //  Function prototypes --------------------------------------------------------
00062 void print_port(void);
00063 void print_spi(void);
00064 
00065 //------------------------------------------------------------------------------
00066 //  Control Program
00067 //------------------------------------------------------------------------------
00068 int main() {
00069     uint16_t spi1_data = 0;
00070     uint16_t spi2_data = 0;
00071 
00072     pc.printf("Start SPI Master & SPI Slave control program\r\n");
00073     spi_1.format(16, 3);    // 16bit, CPOL=1, CPHA=1
00074     spi_2.format(16, 3);
00075     spi_3.format(16, 3);
00076     print_port();
00077     print_spi();
00078 #if WORKS_WELL
00079     // set register directly
00080         // original setting 0x8a33
00081         //  BIDIMODE(bit15) = 1 (why?)
00082         //  SPE(bit6) = 0 (when enbale SPI?)
00083         //  BR(bit5:3) = 110 -> fpclk/128 (correct)
00084     SPI1->CR1 = 0x0a73;
00085         // original setting 0x8a2b
00086         //  same as above SPI1
00087         //  in addition, BR(bit5:3) = 101 -> fpclk/64
00088         //      because SPI1 is APB2(max90MHz) and SPI2&3 are APB1(Max45MHz)
00089     SPI2->CR1 = 0x0a6b;     // 
00090     print_spi();
00091 #elif DOES_NOT_WORK
00092     // no additional setting
00093     // Original setting
00094         // SPI1->CR1 = 0x8a33;
00095         // SPI2->CR1 = 0x8a2b;
00096 #endif
00097     for (uint16_t i = 0;; i++){
00098         spi_3.write(i);
00099         wait_us(100);
00100         if (spi_1.receive() != 0){
00101             spi1_data = spi_1.read();// Read byte from master
00102         }
00103         if (spi_2.receive() != 0){
00104             spi2_data = spi_2.read();// Read byte from master
00105         }
00106         pc.printf("%d, %d, %d\r\n", i, spi1_data, spi2_data);
00107         if ((i != spi1_data) || (i != spi2_data)){
00108              pc.printf("Data unmatch!!\r\n");
00109         }
00110     }
00111 }
00112 
00113 void print_port(void)
00114 {
00115     //---- Only for Debug purpose
00116         //  PA
00117     pc.printf("PA7/AF5,PA5/AF5,PA4/AF5\r\n");
00118     pc.printf("PA7/AF5(SPI1/MOSI),PA5/AF5(SPI1/SCLK)\r\n");
00119     pc.printf("PA->\r\n");
00120     pc.printf("AFRL    0x%08x:0x%08x\r\n",&GPIOA->AFR[0], GPIOA->AFR[0]);
00121     pc.printf("AFRH    0x%08x:0x%08x\r\n",&GPIOA->AFR[1], GPIOA->AFR[1]);
00122     pc.printf("MODER   0x%08x:0x%08x\r\n",&GPIOA->MODER, GPIOA->MODER);
00123     pc.printf("PUPDR   0x%08x:0x%08x\r\n",&GPIOA->PUPDR, GPIOA->PUPDR);
00124     pc.printf("OTYPER  0x%08x:0x%08x\r\n",&GPIOA->OTYPER, GPIOA->OTYPER);
00125     pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOA->OSPEEDR, GPIOA->OSPEEDR);
00126         //  PB
00127     pc.printf("PB10/AF5(SPI2/SCLK),PB5/AF6(MOSI),PB3/AF6(SCLK)\r\n");
00128     pc.printf("PB->\r\n");
00129     pc.printf("AFRL    0x%08x:0x%08x\r\n",&GPIOB->AFR[0], GPIOB->AFR[0]);
00130     pc.printf("AFRH    0x%08x:0x%08x\r\n",&GPIOB->AFR[1], GPIOB->AFR[1]);
00131     pc.printf("MODER   0x%08x:0x%08x\r\n",&GPIOB->MODER, GPIOB->MODER);
00132     pc.printf("PUPDR   0x%08x:0x%08x\r\n",&GPIOB->PUPDR, GPIOB->PUPDR);
00133     pc.printf("OTYPER  0x%08x:0x%08x\r\n",&GPIOB->OTYPER, GPIOB->OTYPER);
00134     pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOB->OSPEEDR, GPIOB->OSPEEDR);
00135         //  PC
00136     pc.printf("PC1/AF7(SPI2/MOSI)\r\n");
00137     pc.printf("PC->\r\n");
00138     pc.printf("AFRL    0x%08x:0x%08x\r\n",&GPIOC->AFR[0], GPIOC->AFR[0]);
00139     pc.printf("AFRH    0x%08x:0x%08x\r\n",&GPIOC->AFR[1], GPIOC->AFR[1]);
00140     pc.printf("MODER   0x%08x:0x%08x\r\n",&GPIOC->MODER, GPIOC->MODER);
00141     pc.printf("PUPDR   0x%08x:0x%08x\r\n",&GPIOC->PUPDR, GPIOC->PUPDR);
00142     pc.printf("OTYPER  0x%08x:0x%08x\r\n",&GPIOC->OTYPER, GPIOC->OTYPER);
00143     pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOC->OSPEEDR, GPIOC->OSPEEDR);
00144 }
00145 
00146 void print_spi(void)
00147 {
00148         //  SPI1
00149     pc.printf("Set to SPISlave\r\n");    
00150     pc.printf("SPI1->\r\n");
00151     pc.printf("CR1   0x%08x:0x%04x\r\n",&SPI1->CR1, SPI1->CR1);
00152     pc.printf("CR2   0x%08x:0x%04x\r\n",&SPI1->CR2, SPI1->CR2);
00153     pc.printf("SR    0x%08x:0x%04x\r\n",&SPI1->SR,  SPI1->SR);
00154     pc.printf("DR    0x%08x:0x%04x\r\n",&SPI1->DR,  SPI1->DR);
00155         //  SPI2
00156     pc.printf("Set to SPISlave\r\n"); 
00157     pc.printf("SPI2->\r\n");
00158     pc.printf("CR1   0x%08x:0x%04x\r\n",&SPI2->CR1, SPI2->CR1);
00159     pc.printf("CR2   0x%08x:0x%04x\r\n",&SPI2->CR2, SPI2->CR2);
00160     pc.printf("SR    0x%08x:0x%04x\r\n",&SPI2->SR,  SPI2->SR);
00161     pc.printf("DR    0x%08x:0x%04x\r\n",&SPI2->DR,  SPI2->DR);
00162         //  SPI3
00163     pc.printf("Set to SPI (Master)\r\n"); 
00164     pc.printf("SPI3->\r\n");
00165     pc.printf("CR1   0x%08x:0x%04x\r\n",&SPI3->CR1, SPI3->CR1);
00166     pc.printf("CR2   0x%08x:0x%04x\r\n",&SPI3->CR2, SPI3->CR2);
00167     pc.printf("SR    0x%08x:0x%04x\r\n",&SPI3->SR,  SPI3->SR);
00168     pc.printf("DR    0x%08x:0x%04x\r\n",&SPI3->DR,  SPI3->DR);
00169 }