Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

C8051F120 Silabs Microcontroller SPI Problem??

Status
Not open for further replies.

yviswanathbe

Full Member level 4
Joined
Jun 14, 2007
Messages
221
Helped
10
Reputation
20
Reaction score
6
Trophy points
1,298
Activity points
3,066
Hi all,

I am interfacing C8051F120 Silabs microcontroller for one of my application.
Description of the Application:

Data Acquisition and Controlling.16 bit ADC and DAC are connected to C8051F120 uC Via SPI.I need to acquire data from the Battery using ADC and Control the Battery(Charge/Discharge) using DAC.

I am not seeing Clock out on SCK pin.(I have checked using Oscilloscope).

Here is my Code.(The code is for ADC)

<pre>#include <c8051F120.h>
#include <stdio.h>

#define ADC_CH0 0x87
#define ADC_CH1 0xC7
#define ADC_CH2 0x97
#define ADC_CH3 0xD7
#define ADC_CH4 0xA7
#define ADC_CH5 0xE7
#define ADC_CH6 0xB7
#define ADC_CH7 0xF7

sbit CS_ADC1=P0^5;
sbit BUSY1=P3^0;


#ifndef BYTE
#define BYTE unsigned char
#endif

#ifndef UINT
#define UINT unsigned int
#endif


void Reset_Sources_Init (void);
void OSCILLATOR_Init (void);
void PORT_Init (void);
//void UART0_Init (void);
void SPI0_Init (void);
void Init_Device (void);

// The following functions save and restore SFRPAGE:
void SPI_Write (UINT address, BYTE value);
BYTE SPI_Read (UINT address);
void adc_convert (UINT);

unsigned char adcresult=0;
unsigned char adc_lowbyte=0,adc_highbyte=0;


void Reset_Sources_Init()

{
WDTCN = 0xDE;
WDTCN = 0xAD;
}

void Oscillator_Init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
OSCICN = 0x00;

}

void Port_IO_Init()
{
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x07;
XBR1 = 0x14;
XBR2 = 0xC4;

P0MDOUT = 0x35;
P1MDOUT = 0x71;
P2MDOUT = 0x73;
P3MDOUT = 0x0F;
SFRPAGE = CONFIG_PAGE;
P5MDOUT = 0xFF;
P6MDOUT = 0xFF;
P7MDOUT = 0xFF;
}

void SPI0_Init()
{
SFRPAGE = SPI0_PAGE;
SPI0CFG = 0x40;
SPI0CN = 0x0D;
SPI0CKR = 0xDC;
}

void Init_Device (void)
{
Reset_Sources_Init ();
OSCILLATOR_Init ();
Port_IO_Init ();
SPI0_Init ();
}

void ADC_Write (UINT channel)
{
BYTE save_sfrpage = SFRPAGE;
SFRPAGE = SPI0_PAGE;

// Writing a byte to the EEPROM is a five-step operation.

// Step1: Set the Write Enable Latch to 1
CS_ADC1 = 0; // Step1.1: Activate Slave Select
SPI0DAT = channel; // Step1.2: Select channel
while (!SPIF); // Step1.3: Wait for end of transfer
SPIF = 0; // Step1.4: Clear the SPI intr. flag
CS_ADC1 = 1; // Step1.5: Deactivate Slave Select
//Delay_us (1); // Step1.6: Wait for at least
// T_NSS_DISABLE_MIN
SFRPAGE = save_sfrpage;
}

BYTE ADC_Read ()
{
BYTE value;
BYTE save_sfrpage = SFRPAGE;
SFRPAGE = SPI0_PAGE;

// Reading a byte from the ADC is a three-step operation.
// Read the value returned
CS_ADC1 = 0;
SPI0DAT = 0; // Dummy write to output serial clock
while (!SPIF); // Wait for the value to be read
SPIF = 0;
CS_ADC1 = 1; // Deactivate Slave Select
//Delay_us (1);
value = SPI0DAT; // Store EEPROM value in local var.

SFRPAGE = save_sfrpage;
return value;
}

void adc_convert (UINT adc_Ch)
{
ADC_Write(adc_Ch);
while(BUSY1==1);
if(BUSY1==0)
{
adc_highbyte=ADC_Read ();
adc_lowbyte=ADC_Read ();
}
}

void main(void)
{
Init_Device();
SFRPAGE = SPI0_PAGE;
while(1)
{
adc_convert (ADC_CH0 );
}
}</pre>

I am not able analyze the problem.Can somebody suggest me to solve my problem.

Thanks and Regards,

Y.Viswanath.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top