//********************************************************************
//
// Author : Yang
//
// Date : 21 November 2009
//
// File : spi.c
//
// Hardware : ADuC845, ADuC847, ADuC848
//
// Description :
//
//
//********************************************************************
#include <intrins.h>
#include <adi/aduc845.h>
typedef unsigned char uchar;
typedef unsigned int uint16 ;
#define counter_max 330 /* when core frequence=6.291456,max=330 */
void SCISendChar(uchar c1);
void SCISendString(uchar * pc1);
void SCISendHex(uchar c1);
uchar dtoa(uchar c1);
uchar xdata SendData[10] ; //varible in xdata , no initial value
uchar SendDataIndex = 0;
//Master
sbit SPI_CS1 = P2^3 ;
sbit SPI_CS2 = P2^6 ;
sbit SPI_CS3 = P2^5 ;
sbit SPI_CS4 = P2^4 ;
//Slave
void init_uart(void);
void delay(uchar ms);
void init_spi(void);
uchar DataRcv = 0;
uchar SPI_DATA_CNT = 0;
uchar temp = 0;
void main (void)
{
uchar i;
PLLCON = 0x01; //6.291456MHz
CFG845 |= 0x01 ; /* important for xram...................................*/
SendData[0] = 0xA1;
SendData[1] = 0xA2;
SendData[2] = 0xA3;
SendData[3] = 0xA4;
SendData[4] = 0xA5;
SendData[5] = 0xA6;
SendData[6] = 0xA7;
SendData[7] = 0xA8;
SendData[8] = 0xA9;
SendData[9] = 0xAA;
init_uart();
init_spi();
EA = 1;
SCISendString("Start\n");
SPI_CS3 = 0;
for(;;)
{
SCISendString("Send:");
SCISendHex(SendData[temp]);
SCISendChar(' ');
SPIDAT = SendData[temp];
delay(1);
if(++temp > 9)
{
temp = 0;
SPI_CS3 = 1;
for(i=0;i<10;i++)
{
delay(250);
}
SPI_CS3 = 0;
}
for(i=0;i<10;i++)
{
delay(100);
}
}
}
void delay(uchar ms)
{
uint16 i;
while(ms--)
{
for(i = 0; i< 330; i++) //for 6.291415 MHz
{
_nop_();
}
}
}
void init_spi(void)
{
SPICON = 0x3F; //Master , fcore/16, cpol=1,cpha=1 SPE = 1;
IEIP2 |= 0x01 ; //Enable SPI interrupt
}
void init_uart(void)
{
T3CON = 0x85; /* 9600 Baud rate,DIV=3 ............*/
T3FD = 0x12;
SCON = 0x52; /* Uart: mode1:8bit bd variable.....*/
}
void interrupt_spi() interrupt 7
{
if (ISPI)
{
DataRcv = SPIDAT; //Auto clear the interrupt flag ISPI
SCISendString("Rcved:");
SCISendHex(DataRcv);
SCISendString("\r\n");
}
}
// Send a Char through SCI
void SCISendChar(uchar c1){
while (!TI);
TI = 0;
SBUF = c1;
}
// Send a Hex through SCI
void SCISendHex(uchar c1){
SCISendChar(dtoa((c1&0xF0)>>4));
SCISendChar(dtoa((c1&0x0F)));
}
// convert a decimal to a char
uchar dtoa(uchar c1) {
return (c1>=10)? (c1+0x37):(c1+0x30);
}
// Send a string through SCI
void SCISendString(uchar * pc1) {
while((*pc1)!=0) {
SCISendChar(*pc1);
pc1++;
}
}