kerden
Junior Member level 3
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.
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);
}