PIC16f877 simuler spi code!

K

kerden

Guest
salut,
pic16f877 intérieure a un spi, mais je tiens à simuler de communiquer EEPROM 93LC46B (64 * 16 bits de ne pas le même que 93lc46A). follow.but mon code comme il ne sont pas les données.quel
est le problème?
merci.

Code://--------------------------------------

PIC puce et 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; / / commencer avec 1

spi_lck ();

)void spi_ewen ()

(

uchar i = 8;

uchar output = 0x30 / / 0011xxxxxspi_start_bit ();

while (i -)

(

SDO = (bit) (output & 0x80);

spi_lck ();

sortie <<= 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 bits adresse, 01XXXXXX et 2bit Opcode

comd_add | = write_add;

spi_send_8bit (comd_add);while (i -)

(

SDO = (bit) (WRITE_DATA & 0x8000);

/ / 64 x 16 bits organisation (93LC46B) doivent écrire deux octetsspi_lck ();

WRITE_DATA <<= 1;

)

while (! RB4) / / écrire attendre complète

CS = 0;)uint read93LC46 (uchar read_add)

(

uchar comd_add = 0x80;

uchar i = 16;

uint lecture de;spi_ewen ();

spi_start_bit ();read_add & = 0x3f, / / 6 bits adresse, 10XXXXXX

comd_add | = read_add;

spi_send_8bit (comd_add);lecture de = 0x0000, / / 64 x 16 bits organisation (93LC46B) devrait envoyer deux octetswhile (i -)

(

spi_lck ();

lecture de | = (uint) SDI;

if (i! = 0) / / la fille du temps ne fonctionnent pas

(

lecture de <<= 1;

)

)

CS = 0;

lecture de retour;

)void spi_init ()

(

TRISB = 0x10 / / SDI "1", SDO / SCK / CS "0"

PORTB = 0; / / CS = 0, SCK = 0;

RBPU = 0;

)principal ()

(

uint données;

spi_init ();

write93LC46 (0x05, 0x5555);

data = read93LC46 (0x05);

tout (1);

)
 

Welcome to EDABoard.com

Sponsor

Back
Top