Greetings,
working with AT32UC3A-Xplained as Master and Accelerometer SCA830-D07 as
Slave. (one master and one slave)
I have a problem with SPI CS.
On the picture is what i get with my osciloscope( 1. SCK;
2. MOSI
3. MISO and
4. CS).
and on the other 2 pictures is how it should be.
This is my code:
#include <avr32/io.h>
#include "compiler.h"
#include "board.h"
#include "power_clocks_lib.h"
#include "gpio.h"
#include "usart.h"
#include "spi_master.h"
#include "stdio.h"
# define EXAMPLE_TARGET_PBACLK_FREQ_HZ FOSC0 // PBA clock target
frequency, in Hz
// spi otions
spi_options_t my_spi_options={
// The SPI channel to set up
.reg = SPI_SLAVE,
// Preferred baudrate for the SPI.
.baudrate = 14400,
// Number of bits in each character (8 to 16).
.bits = 8,
// Delay before first clock pulse after selecting slave (in PBA
clock periods). (min 5ns für STEVAL-MKI105V1)
.spck_delay = 0, // ca. 20,0 ns 5
// Delay between each transfer/character (in PBA clock periods).
.trans_delay = 0,
// Sets this chip to stay active after last transfer to it.
.stay_act = 1,
// Which SPI mode to use when transmitting.
.spi_mode = SPI_MODE_1,
// Disables the mode fault detection.
// With this bit cleared, the SPI master mode will disable itself
if another
// master tries to address it.
.modfdis = 1
};
struct spi_device SPI_DEVICE_EXAMPLE = {
//! Board specific select id
.id = SPI_SLAVE };
void spi_init_module(void)
{
//Init SPI module as master
spi_initMaster(SPI_EXAMPLE,&my_spi_options);
//Setup configuration for chip connected to CS1
spi_setupChipReg(SPI_EXAMPLE,&my_spi_options,sysclk_get_pba_hz());
//Allow the module to transfer data
spi_enable(SPI_EXAMPLE);
}
int status;
int status1;
uint16_t data1;
uint16_t data;
int main(void)
{
static const gpio_map_t SPI_GPIO_MAP =
{
{AVR32_SPI0_SCK_0_0_PIN,AVR32_SPI0_SCK_0_0_FUNCTION},
{AVR32_SPI0_MOSI_0_0_PIN,AVR32_SPI0_MOSI_0_0_FUNCTION},
{AVR32_SPI0_MISO_0_0_PIN,AVR32_SPI0_MISO_0_0_FUNCTION},
{AVR32_SPI0_NPCS_3_0_PIN, //AVR32_SPI0_NPCS_3_0_FUNCTION},
},
};
gpio_enable_module(SPI_GPIO_MAP,
sizeof(SPI_GPIO_MAP) / sizeof(SPI_GPIO_MAP[0]));
pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
sysclk_init();
sysclk_enable_peripheral_clock(SPI_EXAMPLE);
spi_init_module();
spi_master_init(SPI_EXAMPLE); // Initiate the SPI Module 1 as Master
spi_initMaster(SPI_EXAMPLE, &my_spi_options);
spi_master_setup_device(SPI_EXAMPLE, &SPI_DEVICE_EXAMPLE, SPI_MODE_0,
my_spi_options.baudrate, 0); // Parametrization for the SPI Module
spi_setupChipReg(SPI_EXAMPLE,&my_spi_options,FOSC0);
spi_enable(SPI_EXAMPLE);
while(1)
{
spi_selectChip(SPI_EXAMPLE, SPI_SLAVE); // select the SPI Module
//Wait for the transmitter to be ready
while(!spi_is_tx_ready(SPI_EXAMPLE));
//Wait for a complete transmission
status = spi_write(SPI_EXAMPLE, 0b00010101);
status = spi_write(SPI_EXAMPLE, 0b00000000); //dummy
status = spi_read(SPI_EXAMPLE, &data);
//empty tx
while(!spi_is_tx_empty(SPI_EXAMPLE));
//Wait for the transmitter to be ready
while(!spi_is_tx_ready(SPI_EXAMPLE));
status1 = spi_write(SPI_EXAMPLE, 0b00010000);
status1 = spi_write(SPI_EXAMPLE, 0b00000000);
status1 = spi_read(SPI_EXAMPLE, &data1);
//Wait for a complete transmission
while(!spi_is_tx_empty(SPI_EXAMPLE));
// Deselect the slave
while(!spi_is_tx_empty(SPI_EXAMPLE));
spi_unselectChip(SPI_EXAMPLE,SPI_SLAVE);
}
}
Can someone tell what am i doing wrong?
Regards
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.



