Test SPISlave \\ Current lib. does not work on STM32F446RE
main.cpp
- Committer:
- kenjiArai
- Date:
- 2017-11-18
- Revision:
- 1:a63fb13a0112
- Parent:
- 0:8f9f2c56e597
File content as of revision 1:a63fb13a0112:
/*
* Mbed Application program / Test SPI function
* Tested on Nucleo-F446RE
*
* Copyright (c) 2017 Kenji Arai / JH1PJL
* http://www.page.sannet.ne.jp/kenjia/index.html
* http://mbed.org/users/kenjiArai/
* Created: November 7th, 2017
* Revised: November 16th, 2017
*/
/*
--SPI1--
SPI1_MOSI: PA_7 GPIO_AF5_SPI1
SPI1_SCLK: PA_5 GPIO_AF5_SPI1
--SPI2--
SPI2_MOSI: PC_1 GPIO_AF7_SPI2
SPI2_SCLK: PB_10 GPIO_AF5_SPI2
--SPI3--
SPI3_MOSI: PB_5 GPIO_AF6_SPI3
SPI3_SCLK: PB_3 GPIO_AF6_SPI3
--PortA--
SPI1_MOSI: PA_7 GPIO_AF5_SPI1
SPI1_SCLK: PA_5 GPIO_AF5_SPI1
--PortB--
SPI2_SCLK: PB_10 GPIO_AF5_SPI2
SPI3_MOSI: PB_5 GPIO_AF6_SPI3
SPI3_SCLK: PB_3 GPIO_AF6_SPI3
--PortC--
SPI2_MOSI: PC_1 GPIO_AF7_SPI2
*/
/*
wiring information
connected PA7(D11),PC_1(A4) and PB_5(D4)
connected PA5(D13),PB_10(D6) and PB_3(D3)
*/
// Include --------------------------------------------------------------------
#include "mbed.h"
// Definition -----------------------------------------------------------------
#define DOES_NOT_WORK 1
#define WORKS_WELL 0
#if (DOES_NOT_WORK + WORKS_WELL) != 1
#error "Please set either DOES_NOT_WORK or WORKS_WELL to 1”
#endif
// Constructor ----------------------------------------------------------------
Serial pc(USBTX, USBRX);
SPISlave spi_1(PA_7 , NC, PA_5, NC);
SPISlave spi_2(PC_1 , NC, PB_10, NC);
SPI spi_3(PB_5 , NC, PB_3);
// RAM ------------------------------------------------------------------------
// ROM / Constant data --------------------------------------------------------
// Function prototypes --------------------------------------------------------
void print_port(void);
void print_spi(void);
//------------------------------------------------------------------------------
// Control Program
//------------------------------------------------------------------------------
int main() {
uint16_t spi1_data = 0;
uint16_t spi2_data = 0;
pc.printf("Start SPI Master & SPI Slave control program\r\n");
spi_1.format(16, 3); // 16bit, CPOL=1, CPHA=1
spi_2.format(16, 3);
spi_3.format(16, 3);
print_port();
print_spi();
#if WORKS_WELL
// set register directly
// original setting 0x8a33
// BIDIMODE(bit15) = 1 (why?)
// SPE(bit6) = 0 (when enbale SPI?)
// BR(bit5:3) = 110 -> fpclk/128 (correct)
SPI1->CR1 = 0x0a73;
// original setting 0x8a2b
// same as above SPI1
// in addition, BR(bit5:3) = 101 -> fpclk/64
// because SPI1 is APB2(max90MHz) and SPI2&3 are APB1(Max45MHz)
SPI2->CR1 = 0x0a6b; //
print_spi();
#elif DOES_NOT_WORK
// no additional setting
// Original setting
// SPI1->CR1 = 0x8a33;
// SPI2->CR1 = 0x8a2b;
#endif
for (uint16_t i = 0;; i++){
spi_3.write(i);
wait_us(100);
if (spi_1.receive() != 0){
spi1_data = spi_1.read();// Read byte from master
}
if (spi_2.receive() != 0){
spi2_data = spi_2.read();// Read byte from master
}
pc.printf("%d, %d, %d\r\n", i, spi1_data, spi2_data);
if ((i != spi1_data) || (i != spi2_data)){
pc.printf("Data unmatch!!\r\n");
}
}
}
void print_port(void)
{
//---- Only for Debug purpose
// PA
pc.printf("PA7/AF5,PA5/AF5,PA4/AF5\r\n");
pc.printf("PA7/AF5(SPI1/MOSI),PA5/AF5(SPI1/SCLK)\r\n");
pc.printf("PA->\r\n");
pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOA->AFR[0], GPIOA->AFR[0]);
pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOA->AFR[1], GPIOA->AFR[1]);
pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOA->MODER, GPIOA->MODER);
pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOA->PUPDR, GPIOA->PUPDR);
pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOA->OTYPER, GPIOA->OTYPER);
pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOA->OSPEEDR, GPIOA->OSPEEDR);
// PB
pc.printf("PB10/AF5(SPI2/SCLK),PB5/AF6(MOSI),PB3/AF6(SCLK)\r\n");
pc.printf("PB->\r\n");
pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOB->AFR[0], GPIOB->AFR[0]);
pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOB->AFR[1], GPIOB->AFR[1]);
pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOB->MODER, GPIOB->MODER);
pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOB->PUPDR, GPIOB->PUPDR);
pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOB->OTYPER, GPIOB->OTYPER);
pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOB->OSPEEDR, GPIOB->OSPEEDR);
// PC
pc.printf("PC1/AF7(SPI2/MOSI)\r\n");
pc.printf("PC->\r\n");
pc.printf("AFRL 0x%08x:0x%08x\r\n",&GPIOC->AFR[0], GPIOC->AFR[0]);
pc.printf("AFRH 0x%08x:0x%08x\r\n",&GPIOC->AFR[1], GPIOC->AFR[1]);
pc.printf("MODER 0x%08x:0x%08x\r\n",&GPIOC->MODER, GPIOC->MODER);
pc.printf("PUPDR 0x%08x:0x%08x\r\n",&GPIOC->PUPDR, GPIOC->PUPDR);
pc.printf("OTYPER 0x%08x:0x%08x\r\n",&GPIOC->OTYPER, GPIOC->OTYPER);
pc.printf("OSPEEDR 0x%08x:0x%08x\r\n",&GPIOC->OSPEEDR, GPIOC->OSPEEDR);
}
void print_spi(void)
{
// SPI1
pc.printf("Set to SPISlave\r\n");
pc.printf("SPI1->\r\n");
pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI1->CR1, SPI1->CR1);
pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI1->CR2, SPI1->CR2);
pc.printf("SR 0x%08x:0x%04x\r\n",&SPI1->SR, SPI1->SR);
pc.printf("DR 0x%08x:0x%04x\r\n",&SPI1->DR, SPI1->DR);
// SPI2
pc.printf("Set to SPISlave\r\n");
pc.printf("SPI2->\r\n");
pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI2->CR1, SPI2->CR1);
pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI2->CR2, SPI2->CR2);
pc.printf("SR 0x%08x:0x%04x\r\n",&SPI2->SR, SPI2->SR);
pc.printf("DR 0x%08x:0x%04x\r\n",&SPI2->DR, SPI2->DR);
// SPI3
pc.printf("Set to SPI (Master)\r\n");
pc.printf("SPI3->\r\n");
pc.printf("CR1 0x%08x:0x%04x\r\n",&SPI3->CR1, SPI3->CR1);
pc.printf("CR2 0x%08x:0x%04x\r\n",&SPI3->CR2, SPI3->CR2);
pc.printf("SR 0x%08x:0x%04x\r\n",&SPI3->SR, SPI3->SR);
pc.printf("DR 0x%08x:0x%04x\r\n",&SPI3->DR, SPI3->DR);
}