Kenji Arai
/
Nucleo_F446RE_SPISlave_not_work
Test SPISlave \\ Current lib. does not work on STM32F446RE
main.cpp@0:8f9f2c56e597, 2017-11-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |