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

Committer:
kenjiArai
Date:
Sat Nov 18 10:15:30 2017 +0000
Revision:
0:8f9f2c56e597
Child:
1:a63fb13a0112
Test SPISlave mode (Not work and good work two version)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:8f9f2c56e597 1 /*
kenjiArai 0:8f9f2c56e597 2 * Mbed Application program / Test SPI function
kenjiArai 0:8f9f2c56e597 3 * Tested on Nucleo-F446RE
kenjiArai 0:8f9f2c56e597 4 *
kenjiArai 0:8f9f2c56e597 5 * Copyright (c) 2017 Kenji Arai / JH1PJL
kenjiArai 0:8f9f2c56e597 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:8f9f2c56e597 7 * http://mbed.org/users/kenjiArai/
kenjiArai 0:8f9f2c56e597 8 * Created: November 7th, 2017
kenjiArai 0:8f9f2c56e597 9 * Revised: November 16th, 2017
kenjiArai 0:8f9f2c56e597 10 */
kenjiArai 0:8f9f2c56e597 11
kenjiArai 0:8f9f2c56e597 12 /*
kenjiArai 0:8f9f2c56e597 13 --SPI1--
kenjiArai 0:8f9f2c56e597 14 SPI1_MOSI: PA_7 GPIO_AF5_SPI1
kenjiArai 0:8f9f2c56e597 15 SPI1_SCLK: PA_5 GPIO_AF5_SPI1
kenjiArai 0:8f9f2c56e597 16 --SPI2--
kenjiArai 0:8f9f2c56e597 17 SPI2_MOSI: PC_1 GPIO_AF7_SPI2
kenjiArai 0:8f9f2c56e597 18 SPI2_SCLK: PB_10 GPIO_AF5_SPI2
kenjiArai 0:8f9f2c56e597 19 --SPI3--
kenjiArai 0:8f9f2c56e597 20 SPI3_MOSI: PB_5 GPIO_AF6_SPI3
kenjiArai 0:8f9f2c56e597 21 SPI3_SCLK: PB_3 GPIO_AF6_SPI3
kenjiArai 0:8f9f2c56e597 22
kenjiArai 0:8f9f2c56e597 23 --PortA--
kenjiArai 0:8f9f2c56e597 24 SPI1_MOSI: PA_7 GPIO_AF5_SPI1
kenjiArai 0:8f9f2c56e597 25 SPI1_SCLK: PA_5 GPIO_AF5_SPI1
kenjiArai 0:8f9f2c56e597 26 --PortB--
kenjiArai 0:8f9f2c56e597 27 SPI2_SCLK: PB_10 GPIO_AF5_SPI2
kenjiArai 0:8f9f2c56e597 28 SPI3_MOSI: PB_5 GPIO_AF6_SPI3
kenjiArai 0:8f9f2c56e597 29 SPI3_SCLK: PB_3 GPIO_AF6_SPI3
kenjiArai 0:8f9f2c56e597 30 --PortC--
kenjiArai 0:8f9f2c56e597 31 SPI2_MOSI: PC_1 GPIO_AF7_SPI2
kenjiArai 0:8f9f2c56e597 32 */
kenjiArai 0:8f9f2c56e597 33
kenjiArai 0:8f9f2c56e597 34 /*
kenjiArai 0:8f9f2c56e597 35 wiring information
kenjiArai 0:8f9f2c56e597 36 connected PA7(D11),PC_1(A4) and PB_5(D4)
kenjiArai 0:8f9f2c56e597 37 connected PA5(D13),PB_10(D6) and PB_3(D3)
kenjiArai 0:8f9f2c56e597 38 */
kenjiArai 0:8f9f2c56e597 39
kenjiArai 0:8f9f2c56e597 40 // Include --------------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 41 #include "mbed.h"
kenjiArai 0:8f9f2c56e597 42
kenjiArai 0:8f9f2c56e597 43 // Definition -----------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 44 #define DOES_NOT_WORK 1
kenjiArai 0:8f9f2c56e597 45 #define WORKS_WELL 0
kenjiArai 0:8f9f2c56e597 46
kenjiArai 0:8f9f2c56e597 47 #if (DOES_NOT_WORK + WORKS_WELL) != 1
kenjiArai 0:8f9f2c56e597 48 #error "Please set either A or B to 1”
kenjiArai 0:8f9f2c56e597 49 #endif
kenjiArai 0:8f9f2c56e597 50
kenjiArai 0:8f9f2c56e597 51 // Constructor ----------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 52 Serial pc(USBTX, USBRX);
kenjiArai 0:8f9f2c56e597 53 SPISlave spi_1(PA_7 , NC, PA_5, NC);
kenjiArai 0:8f9f2c56e597 54 SPISlave spi_2(PC_1 , NC, PB_10, NC);
kenjiArai 0:8f9f2c56e597 55 SPI spi_3(PB_5 , NC, PB_3);
kenjiArai 0:8f9f2c56e597 56
kenjiArai 0:8f9f2c56e597 57 // RAM ------------------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 58
kenjiArai 0:8f9f2c56e597 59 // ROM / Constant data --------------------------------------------------------
kenjiArai 0:8f9f2c56e597 60
kenjiArai 0:8f9f2c56e597 61 // Function prototypes --------------------------------------------------------
kenjiArai 0:8f9f2c56e597 62 void print_port(void);
kenjiArai 0:8f9f2c56e597 63 void print_spi(void);
kenjiArai 0:8f9f2c56e597 64
kenjiArai 0:8f9f2c56e597 65 //------------------------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 66 // Control Program
kenjiArai 0:8f9f2c56e597 67 //------------------------------------------------------------------------------
kenjiArai 0:8f9f2c56e597 68 int main() {
kenjiArai 0:8f9f2c56e597 69 uint16_t spi1_data = 0;
kenjiArai 0:8f9f2c56e597 70 uint16_t spi2_data = 0;
kenjiArai 0:8f9f2c56e597 71
kenjiArai 0:8f9f2c56e597 72 pc.printf("Start SPI Master & SPI Slave control program\r\n");
kenjiArai 0:8f9f2c56e597 73 spi_1.format(16, 3); // 16bit, CPOL=1, CPHA=0
kenjiArai 0:8f9f2c56e597 74 spi_2.format(16, 3);
kenjiArai 0:8f9f2c56e597 75 spi_3.format(16, 3);
kenjiArai 0:8f9f2c56e597 76 print_port();
kenjiArai 0:8f9f2c56e597 77 print_spi();
kenjiArai 0:8f9f2c56e597 78 #if WORKS_WELL
kenjiArai 0:8f9f2c56e597 79 // set register directly
kenjiArai 0:8f9f2c56e597 80 // original setting 0x8a33
kenjiArai 0:8f9f2c56e597 81 // BIDIMODE(bit15) = 1 (why?)
kenjiArai 0:8f9f2c56e597 82 // SPE(bit6) = 0 (when enbale SPI?)
kenjiArai 0:8f9f2c56e597 83 // BR(bit5:3) = 110 -> fpclk/128 (correct)
kenjiArai 0:8f9f2c56e597 84 SPI1->CR1 = 0x0a73;
kenjiArai 0:8f9f2c56e597 85 // original setting 0x8a2b
kenjiArai 0:8f9f2c56e597 86 // same as above SPI1
kenjiArai 0:8f9f2c56e597 87 // in addition, BR(bit5:3) = 101 -> fpclk/64
kenjiArai 0:8f9f2c56e597 88 // because SPI1 is APB2(max90MHz) and SPI2&3 are APB1(Max45MHz)
kenjiArai 0:8f9f2c56e597 89 SPI2->CR1 = 0x0a6b; //
kenjiArai 0:8f9f2c56e597 90 print_spi();
kenjiArai 0:8f9f2c56e597 91 #elif DOES_NOT_WORK
kenjiArai 0:8f9f2c56e597 92 // no additional setting
kenjiArai 0:8f9f2c56e597 93 // Original setting
kenjiArai 0:8f9f2c56e597 94 // SPI1->CR1 = 0x8a33;
kenjiArai 0:8f9f2c56e597 95 // SPI2->CR1 = 0x8a2b;
kenjiArai 0:8f9f2c56e597 96 #endif
kenjiArai 0:8f9f2c56e597 97 for (uint16_t i = 0;; i++){
kenjiArai 0:8f9f2c56e597 98 spi_3.write(i);
kenjiArai 0:8f9f2c56e597 99 wait_us(100);
kenjiArai 0:8f9f2c56e597 100 if (spi_1.receive() != 0){
kenjiArai 0:8f9f2c56e597 101 spi1_data = spi_1.read();// Read byte from master
kenjiArai 0:8f9f2c56e597 102 }
kenjiArai 0:8f9f2c56e597 103 if (spi_2.receive() != 0){
kenjiArai 0:8f9f2c56e597 104 spi2_data = spi_2.read();// Read byte from master
kenjiArai 0:8f9f2c56e597 105 }
kenjiArai 0:8f9f2c56e597 106 pc.printf("%d, %d, %d\r\n", i, spi1_data, spi2_data);
kenjiArai 0:8f9f2c56e597 107 if ((i != spi1_data) || (i != spi2_data)){
kenjiArai 0:8f9f2c56e597 108 pc.printf("Data unmatch!!\r\n");
kenjiArai 0:8f9f2c56e597 109 }
kenjiArai 0:8f9f2c56e597 110 }
kenjiArai 0:8f9f2c56e597 111 }
kenjiArai 0:8f9f2c56e597 112
kenjiArai 0:8f9f2c56e597 113 void print_port(void)
kenjiArai 0:8f9f2c56e597 114 {
kenjiArai 0:8f9f2c56e597 115 //---- Only for Debug purpose
kenjiArai 0:8f9f2c56e597 116 // PA
kenjiArai 0:8f9f2c56e597 117 pc.printf("PA7/AF5,PA5/AF5,PA4/AF5\r\n");
kenjiArai 0:8f9f2c56e597 118 pc.printf("PA7/AF5(SPI1/MOSI),PA5/AF5(SPI1/SCLK)\r\n");
kenjiArai 0:8f9f2c56e597 119 pc.printf("PA->\r\n");
kenjiArai 0:8f9f2c56e597 120 pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOA->AFR[0], GPIOA->AFR[0]);
kenjiArai 0:8f9f2c56e597 121 pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOA->AFR[1], GPIOA->AFR[1]);
kenjiArai 0:8f9f2c56e597 122 pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOA->MODER, GPIOA->MODER);
kenjiArai 0:8f9f2c56e597 123 pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOA->PUPDR, GPIOA->PUPDR);
kenjiArai 0:8f9f2c56e597 124 pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOA->OTYPER, GPIOA->OTYPER);
kenjiArai 0:8f9f2c56e597 125 pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOA->OSPEEDR, GPIOA->OSPEEDR);
kenjiArai 0:8f9f2c56e597 126 // PB
kenjiArai 0:8f9f2c56e597 127 pc.printf("PB10/AF5(SPI2/SCLK),PB5/AF6(MOSI),PB3/AF6(SCLK)\r\n");
kenjiArai 0:8f9f2c56e597 128 pc.printf("PB->\r\n");
kenjiArai 0:8f9f2c56e597 129 pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOB->AFR[0], GPIOB->AFR[0]);
kenjiArai 0:8f9f2c56e597 130 pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOB->AFR[1], GPIOB->AFR[1]);
kenjiArai 0:8f9f2c56e597 131 pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOB->MODER, GPIOB->MODER);
kenjiArai 0:8f9f2c56e597 132 pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOB->PUPDR, GPIOB->PUPDR);
kenjiArai 0:8f9f2c56e597 133 pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOB->OTYPER, GPIOB->OTYPER);
kenjiArai 0:8f9f2c56e597 134 pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOB->OSPEEDR, GPIOB->OSPEEDR);
kenjiArai 0:8f9f2c56e597 135 // PC
kenjiArai 0:8f9f2c56e597 136 pc.printf("PC1/AF7(SPI2/MOSI)\r\n");
kenjiArai 0:8f9f2c56e597 137 pc.printf("PC->\r\n");
kenjiArai 0:8f9f2c56e597 138 pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOC->AFR[0], GPIOC->AFR[0]);
kenjiArai 0:8f9f2c56e597 139 pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOC->AFR[1], GPIOC->AFR[1]);
kenjiArai 0:8f9f2c56e597 140 pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOC->MODER, GPIOC->MODER);
kenjiArai 0:8f9f2c56e597 141 pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOC->PUPDR, GPIOC->PUPDR);
kenjiArai 0:8f9f2c56e597 142 pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOC->OTYPER, GPIOC->OTYPER);
kenjiArai 0:8f9f2c56e597 143 pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOC->OSPEEDR, GPIOC->OSPEEDR);
kenjiArai 0:8f9f2c56e597 144 }
kenjiArai 0:8f9f2c56e597 145
kenjiArai 0:8f9f2c56e597 146 void print_spi(void)
kenjiArai 0:8f9f2c56e597 147 {
kenjiArai 0:8f9f2c56e597 148 // SPI1
kenjiArai 0:8f9f2c56e597 149 pc.printf("Set to SPISlave\r\n");
kenjiArai 0:8f9f2c56e597 150 pc.printf("SPI1->\r\n");
kenjiArai 0:8f9f2c56e597 151 pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI1->CR1, SPI1->CR1);
kenjiArai 0:8f9f2c56e597 152 pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI1->CR2, SPI1->CR2);
kenjiArai 0:8f9f2c56e597 153 pc.printf("SR 0x%08x:0x%04x\r\n",&SPI1->SR, SPI1->SR);
kenjiArai 0:8f9f2c56e597 154 pc.printf("DR 0x%08x:0x%04x\r\n",&SPI1->DR, SPI1->DR);
kenjiArai 0:8f9f2c56e597 155 // SPI2
kenjiArai 0:8f9f2c56e597 156 pc.printf("Set to SPISlave\r\n");
kenjiArai 0:8f9f2c56e597 157 pc.printf("SPI2->\r\n");
kenjiArai 0:8f9f2c56e597 158 pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI2->CR1, SPI2->CR1);
kenjiArai 0:8f9f2c56e597 159 pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI2->CR2, SPI2->CR2);
kenjiArai 0:8f9f2c56e597 160 pc.printf("SR 0x%08x:0x%04x\r\n",&SPI2->SR, SPI2->SR);
kenjiArai 0:8f9f2c56e597 161 pc.printf("DR 0x%08x:0x%04x\r\n",&SPI2->DR, SPI2->DR);
kenjiArai 0:8f9f2c56e597 162 // SPI3
kenjiArai 0:8f9f2c56e597 163 pc.printf("Set to SPI (Master)\r\n");
kenjiArai 0:8f9f2c56e597 164 pc.printf("SPI3->\r\n");
kenjiArai 0:8f9f2c56e597 165 pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI3->CR1, SPI3->CR1);
kenjiArai 0:8f9f2c56e597 166 pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI3->CR2, SPI3->CR2);
kenjiArai 0:8f9f2c56e597 167 pc.printf("SR 0x%08x:0x%04x\r\n",&SPI3->SR, SPI3->SR);
kenjiArai 0:8f9f2c56e597 168 pc.printf("DR 0x%08x:0x%04x\r\n",&SPI3->DR, SPI3->DR);
kenjiArai 0:8f9f2c56e597 169 }