You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
1.9 KiB
117 lines
1.9 KiB
11 years ago
|
/* spi.c */
|
||
|
|
||
|
#include "spi.h"
|
||
|
#include "interrupt.h"
|
||
|
#include "event.h"
|
||
|
#include "uart.h"
|
||
|
|
||
|
#define SSPBASE 0xE0068000
|
||
|
|
||
|
#define SSPCR0 0x00
|
||
|
#define SSPCR1 0x04
|
||
|
#define SSPDR 0x08
|
||
|
#define SSPSR 0x0c
|
||
|
#define SSPCPSR 0x10
|
||
|
#define SSPIMSC 0x14
|
||
|
#define SSPRIS 0x18
|
||
|
#define SSPMIS 0x1c
|
||
|
#define SSPICR 0x20
|
||
|
|
||
|
#define REG(x) (((volatile unsigned char *)SSPBASE)[x])
|
||
|
#define WREG(x) (((volatile unsigned int *)SSPBASE)[(x)/sizeof(unsigned int)])
|
||
|
|
||
|
#define TNF (REG(SSPSR) & (1<<1))
|
||
|
#define RNE (REG(SSPSR) & (1<<2))
|
||
|
|
||
|
#define FP0XVAL (*((volatile unsigned int *) 0x3FFFC014))
|
||
|
#define FP0XSET (*((volatile unsigned int *) 0x3FFFC018))
|
||
|
#define FP0XCLR (*((volatile unsigned int *) 0x3FFFC01C))
|
||
|
|
||
|
void init_spi(void)
|
||
|
{
|
||
|
WREG(SSPCR0) = 0x1f07; /* SPI clock = PCLK/64, mode 0, 8 bits */
|
||
|
// WREG(SSPCR0) = 0xff07;
|
||
|
/* Set to 0x0007 later */
|
||
|
REG(SSPCPSR) = 2; /* Divide PCLK by 2 */
|
||
|
REG(SSPCR1) = 0x0002; /* Enable SSP, Master mode */
|
||
|
}
|
||
|
|
||
|
void spi_speedup(void)
|
||
|
{
|
||
|
#if 1
|
||
|
WREG(SSPCR0) = 0x0107; /* SPI clock = PCLK/4, mode 0, 8 bits */
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void spi_write_byte(char byte)
|
||
|
{
|
||
|
unsigned int dummy;
|
||
|
|
||
|
while (!TNF) ;
|
||
|
WREG(SSPDR) = byte;
|
||
|
|
||
|
while (!RNE) ;
|
||
|
dummy = REG(SSPDR);
|
||
|
|
||
|
#ifdef SPIDEBUG
|
||
|
putstr(">");
|
||
|
puthex(byte);
|
||
|
putstr("(");
|
||
|
puthex(dummy);
|
||
|
putstr(") ");
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
char spi_read_byte(void)
|
||
|
{
|
||
|
char byte;
|
||
|
|
||
|
while (!TNF) ;
|
||
|
WREG(SSPDR) = 0xff;
|
||
|
|
||
|
while (!RNE) ;
|
||
|
byte = (char) REG(SSPDR);
|
||
|
|
||
|
#ifdef SPIDEBUG
|
||
|
putstr("<");
|
||
|
puthex(byte);
|
||
|
putstr(" ");
|
||
|
#endif
|
||
|
|
||
|
return byte;
|
||
|
}
|
||
|
|
||
|
void spi_write_bytes(char *data, int len)
|
||
|
{
|
||
|
while (len--)
|
||
|
spi_write_byte(*data++);
|
||
|
}
|
||
|
|
||
|
void spi_read_bytes(char *data, int len)
|
||
|
{
|
||
|
while (len--)
|
||
|
*data++ = spi_read_byte();
|
||
|
}
|
||
|
|
||
|
void spi_transaction_start(void)
|
||
|
{
|
||
|
FP0XCLR = 0x00200000;
|
||
|
}
|
||
|
|
||
|
void spi_transaction_stop(void)
|
||
|
{
|
||
|
FP0XSET = 0x00200000;
|
||
|
}
|
||
|
|
||
|
void spi_drain(void)
|
||
|
{
|
||
|
char byte;
|
||
|
putstr("Draining:");
|
||
|
while (RNE) {
|
||
|
byte = (char) REG(SSPDR);
|
||
|
putstr(" ");
|
||
|
puthex(byte);
|
||
|
}
|
||
|
putstr("\r\n");
|
||
|
}
|