Kenji Arai
/
Nucleo_F446RE_SPISlave_not_work
Test SPISlave \\ Current lib. does not work on STM32F446RE
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 17 2022 23:03:31 by 1.7.2