Здравствуйте коты!
Когда то давно нашел в Интернете пример использования ENC28J60 - проект WEB_TIMER
автор подписался так: * Created: 30.11.2014 17:31:19
* Author: stalin
Более найти не могу, а то бы указал ссылку, поэтому прикреплю архив,
Там реализован http сервер
Хотел поменять используемый порт SPI на PORTА (реализовано же программно, правильно?)
Убился, не пойму зачем строка в файле enc28j60.h :
#define SPI_SS (1<<PB4) // для нормальной работы SPI вывод SS должен быть настроен либо как выход либо как вход и на нем должна быть лог. 1
что за линия SS - нет такой на модуле с чипом ENC28j60
Понимаю что схема бы помогла - но нет её
Может какие мысли будут без неё, может кто использовал этот пример
про реализацию стека для ENC28j60
про реализацию стека для ENC28j60
- Вложения
-
- WEB_TIMER.rar
- пример http сервера
- (200.86 КБ) 193 скачивания
Re: про реализацию стека для ENC28j60
SS - это Slave Select его еще называют CS - отвечает за выбор конкретного устройства на шине SPI.
Вы похоже не читали про SPI шину иначе таких вопросов бы не возникало.
3 сигнала общие для всех устройств
MOSI - Master Output Slave Input - выход данных с ведущего(микроконтроллера)
MISO - Master Input Slave Output - вход данных на ведущий(микроконтроллер)
SCK - Стробирующий сигнал обеспечивает синхронность данных
SS(CS) - отдельный для каждого устройства - пока неактивен остальные 3 должны "висеть в воздухе" - 3 состояние не 0 и не 1.
Когда начинается работа с устройством SS устанавливается в активный уровень(обычно низкий)
Вы похоже не читали про SPI шину иначе таких вопросов бы не возникало.
3 сигнала общие для всех устройств
MOSI - Master Output Slave Input - выход данных с ведущего(микроконтроллера)
MISO - Master Input Slave Output - вход данных на ведущий(микроконтроллер)
SCK - Стробирующий сигнал обеспечивает синхронность данных
SS(CS) - отдельный для каждого устройства - пока неактивен остальные 3 должны "висеть в воздухе" - 3 состояние не 0 и не 1.
Когда начинается работа с устройством SS устанавливается в активный уровень(обычно низкий)
Re: про реализацию стека для ENC28j60
Смутило вот что
#define ENC28J60_SPI_CS (1<<PB2)
#define ENC28J60_SPI_MOSI (1<<PB5)
#define ENC28J60_SPI_MISO (1<<PB6)
#define ENC28J60_SPI_SCK (1<<PB7)
#define SPI_SS (1<<PB4) // для нормальной работы SPI вывод SS должен быть настроен либо как выход либо как вход и на нем должна быть лог. 1
Добавлено after 2 hours 14 minutes 46 seconds:
Состряпал я болваночку, убрал всё лишнее использую только lan.c и enc28j60.c:
Ожидал увидеть ответ на ping. Да не тут то было!
Вроде подвисает на lan_init();
В чём дело???
Добавлено after 1 hour 49 minutes 58 seconds:
Вопрос выродился вот в какой:
Помогите переделать функцию - из аппаратной реализации SPI:
сделать программную, на максимальной скорости кварца, где порты заданы так:
Помогите а?
#define ENC28J60_SPI_CS (1<<PB2)
#define ENC28J60_SPI_MOSI (1<<PB5)
#define ENC28J60_SPI_MISO (1<<PB6)
#define ENC28J60_SPI_SCK (1<<PB7)
#define SPI_SS (1<<PB4) // для нормальной работы SPI вывод SS должен быть настроен либо как выход либо как вход и на нем должна быть лог. 1
Добавлено after 2 hours 14 minutes 46 seconds:
Состряпал я болваночку, убрал всё лишнее использую только lan.c и enc28j60.c:
Спойлер
Код: Выделить всё
//....тут стандартные инклуды - пропустил
#include "lan.h" //работа по TCP c 28J60
uint32_t tick_count=0;//возвращает количество мс с момента включения питания. Назначение мне пока не очень ясно...
ISR( TIMER2_OVF_vect ) // 1 кГц
{
tick_count++;//счетчик числа милисекунд от начала включения - нужно для lan.c
}//1кГц
uint8_t tcp_listen(uint8_t id, eth_frame_t *frame)
{
// Коллбэк, вызываемый при получении запроса на соединение. Должен возвращать ненулевое значение, если приложение
// подтверждает соединение. id — индекс соединения (которое будет открыто, если приложение подтвердит установку
// соединения), frame — указатель на буфер пакета, содержащий полученный пакет
ip_packet_t *ip = (void*)(frame->data);
tcp_packet_t *tcp = (void*)(ip->data);
if (tcp->to_port == htons(80)) return 1;
else return 0;
}
// Коллбэк, вызываемый при получении данных по TCP. id — индекс соединения, frame — указатель на буфер пакета, len — количество полученных полезных данных
void tcp_write(uint8_t id, eth_frame_t *frame, uint16_t len)
{
ip_packet_t *ip = (void*)(frame->data);
tcp_packet_t *tcp = (void*)(ip->data);
char *req = (void*)tcp_get_data(tcp);
///ИспользуемПолученнуюСтроку((unsigned char*)req);
wdt_reset();
}//proc
int main (void)
{
ip_addr = IP_ADDR;//определены в lan.h
ip_mask = IP_SUBNET_MASK;
ip_gateway = IP_DEFAULT_GATEWAY;
tick_count = 0;
lan_init();
sei();
wdt_enable(WDTO_1S);
while(1)
{
lan_poll();
wdt_reset();
}//while
}//main
Ожидал увидеть ответ на ping. Да не тут то было!
Вроде подвисает на lan_init();
В чём дело???
Добавлено after 1 hour 49 minutes 58 seconds:
Вопрос выродился вот в какой:
Помогите переделать функцию - из аппаратной реализации SPI:
Код: Выделить всё
uint8_t enc28j60_rxtx(uint8_t data)
{
SPDR = data;
while(!(SPSR & (1<<SPIF)))
;
return SPDR;
}
#define enc28j60_rx() enc28j60_rxtx(0xff)
#define enc28j60_tx(data) enc28j60_rxtx(data)
сделать программную, на максимальной скорости кварца, где порты заданы так:
Код: Выделить всё
#define ENC28J60_SPI_SCK (1<<PA2)
#define ENC28J60_SPI_MOSI (1<<PA1)
#define ENC28J60_SPI_MISO (1<<PA0) Помогите а?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: про реализацию стека для ENC28j60
SPI - самый элементарнийший интерфейс. Какие тут могут возникнуть проблемы ? Обычный ногодрыг
Да и в тырнэте по нему инфы - море. Даже не море, а океан...
Да и в тырнэте по нему инфы - море. Даже не море, а океан...
Re: про реализацию стека для ENC28j60
Не думаю, что программно можно достичь большей скорости, чем аппаратным способом, который можно настраивать в очень широком диапазоне скоростей.
