ENC28J60 и STR710. есть работающий проект. но по SPI передача и прием идет по 16 бит. неудобство в считывании/записи буфера. вот так:
void netbuf_read(void *buffer, int len)
{ unsigned short v;
netbuf_rdpt=netbuf_rxwrap(netbuf_rdpt+len);
while (len--)
{
spi_cs(1);
v = netbuf_pending=ENC28_RBM;
spi_putc( v ‹‹
; /* ERDPT is preset */
spi_cs(0);
*((unsigned char *)buffer)=spi_getc();
buffer=((unsigned char *)buffer)+1;
}
/* leave SPI open */
}
void netbuf_write(void *buffer, int len)
{ unsigned short v;
netbuf_wrpt+=len;
netbuf_wrpt&=ENC28_BUFSIZE-1;
while (len--)
{
v = netbuf_pending=ENC28_WBM;
v = (v ‹‹
| *((unsigned char *)buffer);
spi_cs(1);
spi_putc(v);
spi_cs(0);
buffer=((unsigned char *)buffer)+1;
}
}
каждый раз происходит переключение CS, занимает очень много времени. хотелось сделать что-то типа :
// Чтение данных из буфера (по адресу в регистрах ERDPT)
void enc28j60_read_buffer(uint8_t *buf, uint16_t len)
{
enc28j60_select();
enc28j60_tx(ENC28J60_SPI_RBM);
while(len--)
*(buf++) = enc28j60_rx();
enc28j60_release();
}
// Запись данных в буфер (по адресу в регистрах EWRPT)
void enc28j60_write_buffer(uint8_t *buf, uint16_t len)
{
enc28j60_select();
enc28j60_tx(ENC28J60_SPI_WBM);
while(len--)
enc28j60_tx(*(buf++));
enc28j60_release();
}
пытался делать так на 8 бит по SPI, но в этом случаи читает первый байт, а после один и тотже. не переходя к следующим.
если не переключать CS каждый раз при команде чтения типа:
spi_cs(1);
while (len--)
{
spi_putc( v ‹‹
;
*((unsigned char *)buffer)=spi_getc();
buffer=((unsigned char *)buffer)+1;
}
spi_cs(0);
приходят беспорядочные данные. в чем может быть проблема? с SPI или настройки ENC28J60?