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.

PIC16f877 simulate spi code!

Status
Not open for further replies.

kerden

Junior Member level 3
Joined
Dec 11, 2004
Messages
25
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
284
spi_init pic 16f877

hi,
pic16f877 has an inner spi, but i want to simulate to communicate EEPROM 93LC46B(64 *16bit not the same as 93lc46A).my code as follow.but it don't out the data. what's the matter?
thank you.

Code:
//--------------------------------------
PIC chip and 93LC46B;
//==================================

#include"pic.h"

#define uchar unsigned char
#define uint unsigned int

#define CS RB1
#define SCK RB2
#define SDI RB4
#define SDO RB5

#define NOP() asm("nop")
#define SomeNOP(); NOP(); NOP(); NOP(); NOP();

void spi_init();
void spi_lck();
void spi_start_bit();
void spi_ewen();
void spi_ewds();
void spi_send_8bit(uchar send_data);
void  write93LC46(uchar write_add,uint write_data);
uint  read93LC46(uchar read_add);

void spi_lck()
{
	SCK = 1;
	SomeNOP();
	SCK = 0;	
}

void spi_start_bit()
{
	CS = 1;
	SDO = 1;//start with 1
	spi_lck();
}

void spi_ewen()
{
	uchar i = 8;
	uchar output = 0x30;//0011xxxxx
	
	spi_start_bit();
	while (i--)
	{
		SDO = (bit)(output & 0x80); 
		spi_lck();
		output <<= 1;	
	}
	CS = 0;	
}

void spi_ewds()
{
	uchar i = 8;
	
	spi_start_bit();
	SDO = 0;
	while(i--)
	{
		spi_lck();
	}
	CS = 0;	
}

void spi_send_8bit(uchar send_data)
{
	uchar i = 8;	
	while(i--)
	{
		SDO = (bit)(send_data & 0x80); 
		spi_lck();
		send_data <<= 1;
	}
}

void  write93LC46(uchar write_add,uint write_data)
{
	uchar comd_add = 0x40;
	uchar i = 16;
	
	spi_ewen();
	spi_start_bit();
		
	write_add &= 0x3f;////6 bit address,01XXXXXX and 2bit Opcode
	comd_add |= write_add;
	spi_send_8bit(comd_add);

	while(i--)
	{
		SDO = (bit)(write_data & 0x8000); 
                                //64 x 16 bit organization (93LC46B) should write two byte

		spi_lck();
		write_data <<= 1;
	}
	while(!RB4);//wait write complete
	CS = 0;
	
}

uint  read93LC46(uchar read_add)
{
	uchar comd_add = 0x80;
	uchar i = 16;
	uint read_data;
	
	spi_ewen();
	spi_start_bit();	
	
	read_add &= 0x3f;//6 bit address,10XXXXXX
	comd_add |= read_add;
	spi_send_8bit(comd_add);
	
	read_data = 0x0000;//64 x 16 bit organization (93LC46B) should  send two byte

	while(i--)
	{
		spi_lck();
		read_data |= (uint)SDI;
		if(i != 0)//the lass time don't run
		{
			read_data <<= 1;
		}	
	}
	CS = 0;
	return read_data;
}

void spi_init()
{
	TRISB = 0x10;//SDI "1",SDO/SCK/CS "0"
	PORTB = 0;//CS = 0,SCK = 0;
	RBPU = 0;		
}


main()
{
	uint data;
	spi_init();
	write93LC46(0x05,0x5555);
	data = read93LC46(0x05);
	while(1);
}
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top