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
ech0 schrieb:> Vielleicht könnt ihr mir helfen...
Sicher, was spricht erstmal gegen die Einbindung der Arduino SPI
Bibliothek. Wenn alles läuft, kannst du immer noch deine Modifikationen
einbauen.
> Ich bin mir grad nicht sicher, ob ich den Code als Datei anhängen darf,
Dafür sind Anhänge da.
Kurze Codeabschnitte kannst du natürlich auch direkt einbetten, dann
aber bitte mit "code" "/code", für C besser noch mit "c" "\c" taggen
(jeweils eingeschlossen in "[" ... "]" damit die sprachspezifischen
Hervorhebungen verwendet werden.
Hi,
danke für die schnelle Antwort. Das mit dem Code merke ich mir.
Ich habe die SPI-Bibliothek per ASF eingebunden und auch diese
Anpassungen in conf_board.h eingefügt.
Arduino-SPI-Biblithek? Im AtmelStudio? In C? Das gibt es?
Ich hab das SPI-Example Projekt von Atmel genommen und ich meine
Funktionen kopiert. mehr eigentlich nicht.
Im Netz hab ich noch 1,2 andere Beispiele für einen "SPI-Master"
gefunden. Leider ebenfalls ohne Ergebnis.
Also
SPI funktioniert nun, laut Logic analyzer.
Was genau der Fehler war? Ich weiss es nicht,
evtl was die con_board nicht korrekt eingebunden.
Angebunden werden soll ein eHajo w5500.
Soweit so gut, ich sende ihm init Kommandos...
Jedoch scheint er die Daten nicht zu übernehmen, beim
Rücklesen ist alles 0.
1
InitResult_tW5500_Init(wiz_NetInfo*NetworkConfig)
2
{
3
uint8_ttmp;
4
uint8_tmemsize[2][8]={
5
{2,2,2,2,2,2,2,2}/* Configure RX Socket Size in kByte*/
6
,{2,2,2,2,2,2,2,2}/* Configure TX Socket Size in kByte*/
7
};
8
9
// w5500_init_io(); //Set the additional IOs to the correct value and direction
10
11
// spi_init_sw(); // Software-SPI-Treiber laden
12
/* Critical section callback - No use in this example */