Gast
#4121946
Hallo ihr lieben.
Erstmal: Tolles Forum. Ich lese immer ab und an mal mit.
Aber nun muss ich mal eure Hilfe erbitten...
Ich hab ein Projekt mit einem Sam 3xe ( arduino due board ).
Diesen programmiere ich im Atmel Studio mit ASF.
Ziel ist es einen Winzer per SPI und einen ESP8266 per USART
anzusteuern.
Nun verzweifle ich bereits bei SPI und USART. Ich habe mir die Beispiele
angesehen und mehr oder weniger nachgebaut. ABER es kommt nichts raus.
Ich verstehe einfach nicht warum...
Vielleicht könnt ihr mir helfen...
Ich bin mir grad nicht sicher, ob ich den Code als Datei anhängen darf,
daher will ich ihn mal hier einbetten. Sorry das der Text dann relativ
lang wird.
mySPI.h
#define USED_SPI SPI0
/* SPI clock configuration. */
static const uint32_t gs_ul_clock_configurations[] =
{ 1, 500000, 1000000, 2000000, 5000000 };
typedef enum
{
SPICLK_1Hz,
SPICLK_500kHz,
SPICLK_1MHz,
SPICLK_2MHz,
SPICLK_5MHz,
}eSPIClockConfig;
#define SPI_MASTER_BASE USED_SPI
/* Chip select. */
#define SPI_CHIP_SEL 0
#define SPI_CHIP_PCS spi_get_pcs(SPI_CHIP_SEL)
/* Delay before SPCK. */
#define SPI_DLYBS 0x40
/* Delay between consecutive transfers. */
#define SPI_DLYBCT 0x10
/* Clock polarity. */
#define SPI_CLK_POLARITY 0
/* Clock phase. */
#define SPI_CLK_PHASE 0
void SPIMaster_Init(eSPIClockConfig clockConfig );
void SPIMaster_Transfer(void *inOutBuffer, uint32_t size );
void SPIMaster_WriteByte( uint8_t inBuf );
uint8_t SPIMaster_ReadByte( void );
void SPIMaster_SelectCS( void );
void SPIMaster_DeselectCS( void );
mySPI.c
void SPIMaster_Init( eSPIClockConfig clockConfig )
{
uint32_t spi_clock = gs_ul_clock_configurations[clockConfig];
#if (SAMG55)
/* Enable the peripheral and set SPI mode. */
flexcom_enable(BOARD_FLEXCOM_SPI);
flexcom_set_opmode(BOARD_FLEXCOM_SPI, FLEXCOM_SPI);
#else
/* Configure an SPI peripheral. */
spi_enable_clock(SPI_MASTER_BASE);
#endif
spi_disable(SPI_MASTER_BASE);
spi_reset(SPI_MASTER_BASE);
spi_set_lastxfer(SPI_MASTER_BASE);
spi_set_master_mode(SPI_MASTER_BASE);
spi_disable_mode_fault_detect(SPI_MASTER_BASE);
spi_set_peripheral_chip_select_value(SPI_MASTER_BASE, SPI_CHIP_PCS);
spi_set_clock_polarity(SPI_MASTER_BASE, SPI_CHIP_SEL,
SPI_CLK_POLARITY);
spi_set_clock_phase(SPI_MASTER_BASE, SPI_CHIP_SEL, SPI_CLK_PHASE);
spi_set_bits_per_transfer(SPI_MASTER_BASE, SPI_CHIP_SEL,
SPI_CSR_BITS_8_BIT);
spi_set_baudrate_div(SPI_MASTER_BASE, SPI_CHIP_SEL,
(sysclk_get_cpu_hz() / spi_clock));
spi_set_transfer_delay(SPI_MASTER_BASE, SPI_CHIP_SEL, SPI_DLYBS,
SPI_DLYBCT);
spi_enable(SPI_MASTER_BASE);
}
void SPIMaster_Transfer(void *inOutBuffer, uint32_t size)
{
uint32_t i;
uint8_t uc_pcs;
static uint16_t data;
uint8_t *p_buffer;
p_buffer = inOutBuffer;
for (i = 0; i < size; i++) {
spi_write(SPI_MASTER_BASE, p_buffer[i], 0, 0);
p_buffer[i] = 0xFF;
/* Wait transfer done. */
while ((spi_read_status(SPI_MASTER_BASE) & SPI_SR_RDRF) == 0);
spi_read(SPI_MASTER_BASE, &data, &uc_pcs);
p_buffer[i] = data;
}
}
void SPIMaster_WriteByte( uint8_t inBuf )
{
uint16_t bufAs16Bit = inBuf;
spi_write(SPI_MASTER_BASE, bufAs16Bit, 0, 0);
while ((spi_read_status(SPI_MASTER_BASE) & SPI_SR_RDRF) == 0);
}
uint8_t SPIMaster_ReadByte( void )
{
uint16_t bufAs16Bit;
uint8_t uc_pcs;
spi_read(SPI_MASTER_BASE, &bufAs16Bit, &uc_pcs);
return (uint8_t)(bufAs16Bit & 0xFF);
}
void SPIMaster_SelectCS( void )
{
ioport_set_port_level( IOPORT_PIOD, PIO_PD10, IOPORT_PIN_LEVEL_LOW );
}
void SPIMaster_DeselectCS( void )
{
ioport_set_port_level( IOPORT_PIOD, PIO_PD10, IOPORT_PIN_LEVEL_LOW );
}
Vielen Dank für eure Hilfe!
Lg ech0