(sorry for the formatting, don’t know how to post properly on this forum)
Yep, i finally sorted it out …
Note that the following is for the SPI1 port, but can be easily modified to match the SPI2 or SPI3 port if available …
In “_spi.h”, include the “stdint.h” and remove the “pins_arduino.h”
In “spi.c”, include headers “Spi.h”, “libmaple.h”, “spi.h”, “wirish.h”
In “spi.c”, declare the pins as follow:
void SpiDevice::initPins() {
pinMode(BOARD_SPI1_MOSI_PIN, OUTPUT_AF_PP);
pinMode(BOARD_SPI1_MISO_PIN, INPUT);
pinMode(BOARD_SPI1_SCK_PIN, OUTPUT_AF_PP);
pinMode(_selectPin, OUTPUT);
deselect();
}
You have to create the “OUTPUT_AF_PP” case in “wirish_digital.cpp” and “io.h” like this:
case OUTPUT_AF_PP:
outputMode = GPIO_AF_OUTPUT_PP;
pwm = false;
break;
In “spi.c”, to initialize (based on spi_init and spi_reconfigure taken from spi.c):
void SpiDevice::initSpi() {
rcc_clk_enable(SPI1->clk_id);
rcc_reset_dev(SPI1->clk_id);
//Disable
spi_irq_disable(SPI1, SPI_INTERRUPTS_ALL);
spi_peripheral_disable(SPI1);
//Mode hardware (to manually drive the NSS pin with the select/deselect functions)
//SC16IS750 supports 4 Mbit/s maximum SPI clock speed means this can theorically handle the SPI_BAUD_PCLK_DIV_32 (2.25 MHz) divider …
//speed = SPI_BAUD_PCLK_DIV_64 = 1.125 MHz
//speed = SPI_BAUD_PCLK_DIV_32 = 2.25 MHz
//speed = SPI_BAUD_PCLK_DIV_16 = 4.5 MHz
SPI1->regs->CR1 = SPI_CR1_SPE | SPI_BAUD_PCLK_DIV_32 | SPI_FRAME_MSB | SPI_DFF_8_BIT | SPI_CR1_MSTR | SPI_MODE_0;
SPI1->regs->CR2 = SPI_CR2_SSOE;
//enable
spi_peripheral_enable(SPI1);
//clear registers by reading them
int clr = 0;
clr = SPI1->regs->SR;
clr = SPI1->regs->DR;
clr = SPI1->regs->CR1;
clr = SPI1->regs->CR2;
//flush
select();
while((SPI1->regs->SR & SPI_SR_BSY) == SPI_SR_BSY);
deselect();
}
In “_spi.c”, the transfer function became:
byte SpiDevice::transfer(volatile byte data) {
// Start the transmission
SPI1->regs->DR = data;
// Wait for the end of the transmission
while((SPI1->regs->SR & SPI_SR_TXE) != SPI_SR_TXE);
// Wait for the end of the reception
while((SPI1->regs->SR & SPI_SR_RXNE) != SPI_SR_RXNE);
// Return the received byte
return (SPI1->regs->DR);
}
i also had to rename the “ring_buffer” variable in parsedstream because it conflict with a maple variable.
if debugging is activated (i.e ERROR_LEVEL > 0 in debug.h), think about replacing “serial.print” by “SerialUSB.print”)
Product WRL-09954 | about 4 months ago
(sorry for the formatting, don’t know how to post properly on this forum) Yep, i finally sorted it out … Note that the following is for the SPI1 port, but can be easily modified to match the SPI2 or SPI3 port if available …
In “_spi.h”, include the “stdint.h” and remove the “pins_arduino.h”
In “spi.c”, include headers “Spi.h”, “libmaple.h”, “spi.h”, “wirish.h”
deselect(); }
Product WRL-09954 | about 7 months ago
Does anyone succeeded in modifying the library for use with the Maple?