PIC16f877 simulovat spi kód!

K

kerden

Guest
nazdar,
pic16f877 má vnitřní spi, ale chci, aby simulovaly komunikovat EEPROM 93LC46B (64 * 16bit není stejné jako 93lc46A). mého kódu follow.but to nejsou uvedeny údaje.Co se děje?
Děkujeme vám.

Kód://--------------------------------------

PIC čipu a 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 s 1

spi_lck ();

)void spi_ewen ()

(

uchar i = 8;

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

while (i -)

(

SDO = (bit) (výstupní & 0x80);

spi_lck ();

výstupní <<= 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ů adresy, 01XXXXXX a 2bit Opcode

comd_add | = write_add;

spi_send_8bit (comd_add);while (i -)

(

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

/ / 64 x 16 bit organizace (93LC46B) by měl napsat dva bytespi_lck ();

write_data <<= 1;

)

while (! RB4); / / počkat, napište kompletní

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ů adresy, 10XXXXXX

comd_add | = read_add;

spi_send_8bit (comd_add);read_data = 0x0000, / / 64 x 16 bit organizace (93LC46B) by měl posílat dva bytewhile (i -)

(

spi_lck ();

read_data | = (uint) SDI;

if (i! = 0) / / se děvče době nejsou v rozporu

(

read_data <<= 1;

)

)

CS = 0;

návrat read_data;

)void spi_init ()

(

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

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

RBPU = 0;

)main ()

(

uint dat;

spi_init ();

write93LC46 (0x05, 0x5555);

data = read93LC46 (0x05);

while (1);

)
 

Welcome to EDABoard.com

Sponsor

Back
Top