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 = 0uint 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);
)
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 = 0uint 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);
)