enc28j60+stm32f100

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

Сообщение wiskas »

Добрый день. Уже третий день бьюсь с даной связкой.Никак не могу понять че тупит enc28j60.
Вот схемы:
333333333.png
(26.91 КБ) 722 скачивания
2222222.png
(23.03 КБ) 810 скачиваний
333.png
(21.5 КБ) 367 скачиваний
Изображение
Изображение
Изображение
Изображение
Изображение



И чуть ниже выложу код с IAR с ноутбука))) и краткие пояснения
Реклама
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

Сообщение wiskas »

Код: Выделить всё

#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <misc.h>

#define enc28j60_select() asm("nop")
#define enc28j60_release() asm("nop")

//Èíèöèàëèçàöèÿ GPIO
void gpio_init()
{
  
        // Initialize SPI
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

        GPIO_InitTypeDef GPIO_InitStruct;

        // MOSI & CLK
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStruct);

        // MISO
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStruct);

        // SS
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStruct);

        // RESET
        GPIO_InitTypeDef GPIO_InitStruct2;
        GPIO_InitStruct2.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct2.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStruct2);


        SPI_InitTypeDef SPI_InitStruct;

        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStruct);


        SPI_Cmd(SPI1, ENABLE);
}

// Îïåðàöèÿ ÷òåíèÿ
uint8_t enc28j60_read_op(uint8_t cmd, uint8_t adr)
{
  uint8_t data;

  // Íèçêèé óðîâåíü íà CS
  enc28j60_select();
    
  // Îòïðàâëÿåì êîìàíäó
  SPI1->DR = (uint8_t)cmd | (adr & 0x1f);
    
  while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)

  // Ïðè íåîáõîäèìîñòè, ïðîïóñêàåì "ëîæíûé" áàéò
  if(adr & 0x80)
  {
    SPI1->DR = (uint8_t)0x1f;
    while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
  } 
    
  // ×èòàåì äàííûå
  data = SPI1->DR;
    
  // Âûñîêèé óðîâåíü íà íîæêå CS
  enc28j60_release();
  return data;
}





// Îïåðàöèÿ çàïèñè
void enc28j60_write_op(uint8_t cmd, uint8_t adr, uint8_t data)
{
    enc28j60_select();
    
    // Îòïðàâëÿåì êîìàíäó
    SPI1->DR = cmd | (adr & 0x1f);
  while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
    
    // Îòïðàâëÿåì çíà÷åíèå
  SPI1->DR = data;
  while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
    
   enc28j60_release();
}




int main(void)
{
  
  for (int i=0; i<1; i++)  Delay3();

  
  gpio_init();
  
  SPI_Cmd(SPI1, ENABLE);
  
  GPIO_SetBits(GPIOB, GPIO_Pin_10);
  GPIO_SetBits(GPIOA, GPIO_Pin_4);
  GPIO_ResetBits(GPIOB, GPIO_Pin_10);

  
/*  
  GPIO_ResetBits(GPIOB, GPIO_Pin_1);
  Delay3();
  GPIO_SetBits(GPIOB, GPIO_Pin_1);
  Delay3();
  Delay3();
  Delay3();
  Delay3();
  Delay3();
  Delay3();
*/
  uint8_t data;    

//  SPI1->DR = 0xFF;
//  Delay3();

  for (int i=0; i<14; i++)
  {
    
    
    enc28j60_write_op(ENC28J60_SPI_BFC, 0x1f, 0x03);
    enc28j60_write_op(ENC28J60_SPI_BFS, 0x1f, 0x03);

    enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x07);
    enc28j60_write_op(ENC28J60_SPI_BFS, 0x15, 0x01);

//    enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x05);
//    enc28j60_write_op(ENC28J60_SPI_BFS, 0x15, 0x01);

//    enc28j60_write_op(ENC28J60_SPI_BFC, 0x15, 0x05);

/*    data =  enc28j60_read_op(ENC28J60_SPI_RCR, 0x00);
     data++;
     data =  enc28j60_read_op(ENC28J60_SPI_RCR, 0x01);
     data++;
     data =  enc28j60_read_op(ENC28J60_SPI_RCR, 0x15);    
     data++;
     data =  enc28j60_read_op(ENC28J60_SPI_RCR, 0x12);    
     data++;
  */          
   // enc28j60_select();
  //  SPI1->DR = 0xFF;
  
   // while(!(SPI1->SR & SPI_SR_TXE)); //Îæèäàåì îêîí÷àíèÿ ïðèåìà äàííûõ ìîäóëåì SPI1 (RXNE =1 - ïðèåìíûé áóôåð ñîäåðæèò äàííûå)
      
   // enc28j60_release();
  }
  while (1)
   {
     
     data =  enc28j60_read_op(ENC28J60_SPI_RCR, 0x12);
     data++;
 Delay1();  
 
   }
   
}

Краткие пояснения: пытаюсь изменить частоту выхода ClockOut микросхемы enc28j60. Но тут есть пару помойму ошибок, я думаю что это
1. Померял выходной сигнал с этого вывода, выходит синусоида, но не ровная, а как бы поплыла
2. Возможно нужно соеденять меньшими проводами и витой парой а не прямыми?
3. С микросхемы енки выходит какойто мусор с выхода СПИ, как будто биты иногда проскакивают.
4. Танцы с бубнами и множество перезагрузок иногда меняло частоту енки и иногда как я понял отключало клок, только почемуто на +, возможно включало частоту 25мгц и осилографом не видно было.
5.соеденял между собой выходы на стм микросхеме, данные отправляются и принимаются нормально, а на енку почемуто не идут.
В чем может быть причина? уровни питания везде нормальные.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

wiskas писал(а):...Никак не могу понять че тупит enc28j60...
MISO можно настроить как и MOSI с CLK - GPIO_Mode_AF_PP
при приеме по SPI проверяем не SPI_SR_TXE а SPI_I2S_FLAG_RXNE или SPI_SR_BSY
вот мой код чтения/записи по SPI

Код: Выделить всё

uint8_t enc28j60_rxtx(uint8_t data)
{
  ENC28J60_SPI->DR = data;
  while( 0 != (ENC28J60_SPI->SR & SPI_SR_BSY) ); // wait RX/TX complette
  return ENC28J60_SPI->DR;
}
PS код с easyelectronics http://we.easyelectronics.ru/electro-an ... 28j60.html рабочий - можно скопировать, кроме обмена
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

Сообщение wiskas »

Вы не поняли меня. Данные приходящие от ENC я снимаю осцилографом, и выход с ENC не подключен к контроллеру.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс дек 19, 2010 23:10:20

Сообщение wiskas »

Тема решена. Ответ был прост - меньше ходи по чужим огородам, меньше наступишь на грабли.
Вход CS ENC28J60 не должен в тупую весеть на земле. Он должен вешатся на землю в начале передачи и подниматся в конце. Хотя гдето на чъемто огороде я видел что КС подтянут на землю, а на контролере на плюс.
Вот такие вот грабли :(
Реклама
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

mrFox, из даташита:
Do not use the BSY flag to handle each data transmission or reception. It is better to use the
TXE and RXNE flags instead.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

wiskas писал(а):...Вход CS ENC28J60 не должен в тупую весеть на земле...
я бы на это и не подумал ибо обычно делаешь автоматически, особенно когда в даташите прописанно
BorisSPB писал(а):Do not use the BSY flag to handle each data transmission or reception.
ну не знаю с BSY все работает нормально да и RXNE я предлагал
Ответить

Вернуться в «ARM»