STM8S+W5100 не могу запустить

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

STM8S+W5100 не могу запустить

Сообщение masterpc »

Здравствуйте уважаемые!
Есть задача связать вместе микроконтроллер STM8S207CB и контроллером W5100.
Управление по SPI и, как мне кажеться, в SPI я и накосячил, что делаю:
Спойлер

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

void SPI_Init(void){
     
     //SPI_init     
     SPI_CR1_bit.BR=0x07;       //fMASTER/256     
     SPI_CR1_bit.CPHA=0;        //The first clock transition is the first data capture edge
     SPI_CR1_bit.CPOL=0;        //SCK to 0 when idle
     SPI_CR2_bit.SSM=1;         //Software slave management enabled
     SPI_CR2_bit.SSI=1;         //Master mode
     SPI_CR1_bit.MSTR=1;        //Master configuration 
     
     SPI_CR1_bit.SPE=1;         //SPI enable               
    
}

void SPI_Write(unsigned int addr,byte data)
{
  
byte buf;

  // Activate the CS pin
  ETH_CS_LO;  
  
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);  
  // Start Wiznet W5100 Write OpCode transmission
  SPI_DR = WIZNET_WRITE_OPCODE;
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);  
  buf=SPI_DR;   //получили ответ на 1-ю посылку
  
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);  
  // Start Wiznet W5100 Address High Bytes transmission
  SPI_DR = (addr & 0xFF00) >> 8;
 // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);  
  buf=SPI_DR;   //получили ответ на 2-ю посылку
  
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);
  // Start Wiznet W5100 Address Low Bytes transmission
  SPI_DR = addr & 0x00FF;
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);
  buf=SPI_DR;   //получили ответ на 3-ю посылку
  
   // Wait for transmission complete
  while (!SPI_SR_bit.TXE);
  // Start Data transmission
  SPI_DR = data;  
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);  
  buf=SPI_DR; //получили ответ на 4-ю посылку
  if(buf==3){/*ST_LED_EN*/}  //чтобы компилятор не ругался на неиспользованную переменную, на время проверки можно светить светодиодом
  
  // CS pin is not active
  ETH_CS_HI;
}
byte SPI_Read(unsigned int addr)
{  
  byte buf;
  
  // Activate the CS pin
  ETH_CS_LO;  
 
 // Wait for transmission complete
  while (!SPI_SR_bit.TXE);  
  // Start Wiznet W5100 Write OpCode transmission
  SPI_DR = WIZNET_READ_OPCODE;
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);  
  buf=SPI_DR;   //получили ответ на 1-ю посылку
  
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);  
  // Start Wiznet W5100 Address High Bytes transmission
  SPI_DR = (addr & 0xFF00) >> 8;
 // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);  
  buf=SPI_DR;   //получили ответ на 2-ю посылку
  
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);
  // Start Wiznet W5100 Address Low Bytes transmission
  SPI_DR = addr & 0x00FF;
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);
  buf=SPI_DR;   //получили ответ на 3-ю посылку
    
  // Wait for transmission complete
  while (!SPI_SR_bit.TXE);
  // Send Dummy transmission for reading the data
  SPI_DR = 0;
  // Wait for transmission complete
  while (!SPI_SR_bit.RXNE);
  buf=SPI_DR;   //получили ответ на 4-ю посылку
 
  // CS pin is not active
  ETH_CS_HI;
  
  return(buf);
}

В результате смотрю осциллографом как посылаются команды, считаю по клокам все идет как надо, если закоротить MOSI/MISO получаю то, что отправляю, при записи регистров W5100 получаю ответ в виде номера посылки, как по даташиту 0х00, 0х01, 0х02, 0х03. При чтении также могу получить ответ 0х00, 0х01, 0х02, но вместо данных резултат нулевой. Судя по всему не правильно выполнена процедура записи регистров, т.к контроллер не пингуется.
Тут я либо не правильно инициализировал SPI, либо не правильно пишу. Ниже код инициализации для пинга
Спойлер

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

void W5100_Init(void)
{
  // Ethernet Setup
  unsigned char mac_addr[] = {0x00,0x16,0x36,0xDE,0x58,0xF6};
  unsigned char ip_addr[] =  {192,168,0,111};
  unsigned char sub_mask[] = {255,255,255,0};
  unsigned char gtw_addr[] = {192,168,0,1}; 
  
  
  //Hardware reset
  W5100_RST_LO;
  delay(ms,100);
  W5100_RST_HI;
  delay(ms,100);
  
  // Setting the Wiznet W5100 Mode Register: 0x0000
  SPI_Write(MR,0x80);            // MR = 0b10000000;
  delay(ms,1);
  
  // Setting the Wiznet W5100 Gateway Address (GAR): 0x0001 to 0x0004  
  SPI_Write(GAR + 0,gtw_addr[0]);  
  SPI_Write(GAR + 1,gtw_addr[1]);
  SPI_Write(GAR + 2,gtw_addr[2]);
  SPI_Write(GAR + 3,gtw_addr[3]);
  delay(ms,1);
  
  // Setting the Wiznet W5100 Source Address Register (SAR): 0x0009 to 0x000E  
  SPI_Write(SAR + 0,mac_addr[0]);
  SPI_Write(SAR + 1,mac_addr[1]);
  SPI_Write(SAR + 2,mac_addr[2]);
  SPI_Write(SAR + 3,mac_addr[3]);
  SPI_Write(SAR + 4,mac_addr[4]);
  SPI_Write(SAR + 5,mac_addr[5]);
  delay(ms,1);
  
  // Setting the Wiznet W5100 Sub Mask Address (SUBR): 0x0005 to 0x0008  
  SPI_Write(SUBR + 0,sub_mask[0]);
  SPI_Write(SUBR + 1,sub_mask[1]);
  SPI_Write(SUBR + 2,sub_mask[2]);
  SPI_Write(SUBR + 3,sub_mask[3]);
  delay(ms,1);
  
  // Setting the Wiznet W5100 IP Address (SIPR): 0x000F to 0x0012  
  SPI_Write(SIPR + 0,ip_addr[0]);
  SPI_Write(SIPR + 1,ip_addr[1]);
  SPI_Write(SIPR + 2,ip_addr[2]);
  SPI_Write(SIPR + 3,ip_addr[3]);
  delay(ms,1);  

  // Setting the Wiznet W5100 RX and TX Memory Size, we use 2KB for Rx/Tx 4 channels 
  SPI_Write(RMSR,0x55);
  SPI_Write(TMSR,0x55);    
}
Для начальной инициализации этих настроек достаточно, но проверка чтения показывает, что ничего не записано, то же самое вижу на осциллографе.
Настройка ГПИО
Спойлер

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

//E~RESET
     PD_DDR_bit.DDR3=1; //PD3 - на вывод.
     PD_CR1_bit.C13=1;  //PD3 - PP
     PD_CR2_bit.C23=0;  //PD3 - ограничение скорости отключено.  
     
     //~CS_ETH
     PC_DDR_bit.DDR3=1; //PC3 - на вывод.
     PC_CR1_bit.C13=1;  //PC3- PP
     PC_CR2_bit.C23=0;  //PC3 - ограничение скорости отключено.      
     
     //SPI_SCLK
     PC_DDR_bit.DDR5=1; //PC5 - на вывод.
     PC_CR1_bit.C15=1;  //PC5- PP
     PC_CR2_bit.C25=0;  //PC5 - ограничение скорости отключено. 
     
     //SPI_MOSI
     PC_DDR_bit.DDR6=1; //PC6 - на вывод.
     PC_CR1_bit.C16=1;  //PC6- PP
     PC_CR2_bit.C26=0;  //PC6 - ограничение скорости отключено. 
     
     //SPI_MISO
     PC_DDR_bit.DDR7=0; //PC7 - на вход.
     PC_CR1_bit.C17=1;  //PC7- Pull-up without interrupt
     PC_CR2_bit.C27=0;   
Буду очень благодарен за любую помощь!!!
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM8S+W5100 не могу запустить

Сообщение pokk »

Здравствуйте, точно такая же засада у меня была всё облазил не как найти не мог в чём косяк. Оказалось в задержке после сброса.
перед инициализацией регистров делаю

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

void iinchip_init(void)
{
  W5100_RESET_LOW;  //  это  к резету  
  Delay(70);
  W5100_RESET_HIGH;
  Delay(70);
  CHIP_WRITE(0x0000,0x80);  //программный  резет 
}

после задержка около 2 секунд или посл инициализации регистров задержка такая я уже везде наставил

после это регистры начали считываться и записываться, но всё равно как-то очень глючно всё работает сейчас вылезла у меня другая проблема что все настройки регистров сбрасываются. а потом опять появляются =) и после того как опять исчезнут то уже полностью нечего не работает
Реклама
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Re: STM8S+W5100 не могу запустить

Сообщение masterpc »

у Вас хоть как то реагирует, у меня же ни как (((
А как сконфигурированы ГПИО и SPI? Какой порядок записи/чтения регистров? У STM8 написано так:
Full Duplex Transmit and receive procedure in master or slave mode
(BDM=0 and RXONLY = 0)
1. Enable the SPI by setting the SPE bit
2. Write the first data to be transmitted in the SPI_DR register (this clears the TXE flag).
3. Wait until TXE = 1 and write the second data to be transmitted. Then wait until RXNE =
1 and read the SPI_DR to get the first received data (this clears the RXNE bit). Repeat
this operation for each data to be transmitted/received until the n-1 received data.
4. Wait until RXNE = 1 and read the last received data.
5. Wait until TXE = 1 and then wait until BSY = 0 before disabling the SPI.
This procedure can also be implemented using dedicated interrupt subroutines launched at
each rising edge of RXNE or TXE flags.


Т.е читать не сразу после передачи первого байта а после передачи второго... Я читаю после первого и получаю ответ 0х03 после передачи последнего байта, что свидетельствует о том, что визнет отвечает. Но что он получает и почему не пишет в регистры загадка...
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Re: STM8S+W5100 не могу запустить

Сообщение masterpc »

Вот документ на то, как правильно должен быть подключен контроллер 5100 при SPI http://www.wiznet.co.kr/UpLoad_Files/Re ... AN_SPI.pdf
Реклама
Эиком - электронные компоненты и радиодетали
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM8S+W5100 не могу запустить

Сообщение pokk »

А как сконфигурированы ГПИО и SPI?
У вас стоит как альтернативные функции ? хотя если вы считываете 0 1 2 то по идее spi должен быть настроен
у меня вот так вот SPI SCK 8 МГц
Спойлер

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

  SPI_InitTypeDef   SPI_InitStructure;

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  //2
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  //SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  //SPI_CalculateCRC(SPI2, DISABLE);

  SPI_Cmd(SPI2, ENABLE);
GPIO
Спойлер

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

 GPIO_InitTypeDef GPIO_InitStructure;
  //SPI_InitTypeDef SPI_InitStructure;


  //GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2);
// Тактирование модуля SPI2 и порта  C B

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);                               //!
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);




   GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2);

  // PC2 PC3  MOSI MISO
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2);
    // PC2 PC3  MOSI MISO
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
  GPIO_Init(GPIOC, &GPIO_InitStructure);




  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2);
  // для ноги SCK PB10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // Выбор CS
  //GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //test//test//test//test//test
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // ??????
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //reset
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //test//test//test//test//test
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // ??????
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;  //CS
  GPIO_Init(GPIOE, &GPIO_InitStructure);


    // СТРОБ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //test//test//test//test//test
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // ??????
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
Считываю вот так на while(1) не обработайте внимания только что сделал это типа проверка
Спойлер

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

unsigned char CHIP_READ(unsigned int addr)
{
unsigned char temp[4];
//int dwt_timestamp;

GPIO_ResetBits(GPIOB, GPIO_Pin_12);

//Delay(1);  //около 64000 тактов



while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData (SPI2,0x0f);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[0]=SPI_I2S_ReceiveData(SPI2);



while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,((addr & 0xFF00) >> 8));
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[1]=SPI_I2S_ReceiveData(SPI2);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,(addr & 0x00FF));
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[2]=SPI_I2S_ReceiveData(SPI2);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,0xff);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
//Delay(1);
//dwt_timestamp123 = DWT_CYCCNT;
temp[3]=SPI_I2S_ReceiveData(SPI2);
//Delay(1);
GPIO_SetBits(GPIOB, GPIO_Pin_12);
//dwt_timestamp123 = DWT_CYCCNT - dwt_timestamp123;    //готово! результат в CPU-"тиках"
if(temp[0]==0x0&&temp[1]==0x01&&temp[2]==0x02){
return temp[3];
}
else {
  while(1);
}
}
Сейчас прикрутил кулер пока работает стабильно.
Реклама
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Re: STM8S+W5100 не могу запустить

Сообщение masterpc »

У меня все запустилось! Оказалось, что STM8 слишком шустрый. Кварц 16МГц, и хоть SPI /256, все равно визнет не упевал за контроллером. Поставил задержку в 1мс после каждой передачи на визнет и все заработало, пингуется на ура. Сейчас берусь за web сервер.
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM8S+W5100 не могу запустить

Сообщение pokk »

Я не знаю как в STM8, но в STM32 перед SPI /256 стоит ещё куча предделителей у wizneta максимальная SCK около 13 МГц.
Эти задержки буду сильно тормозить загрузку страниц.
Аватара пользователя
masterpc
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Чт авг 13, 2009 08:22:53
Откуда: Vinnitsa

Re: STM8S+W5100 не могу запустить

Сообщение masterpc »

Да, не кошерно, но уменьшение задержки до 100мкс сразу приводит к тому, что SPI не корректно пишет/читает. Может проблема в том, что выводы для параллельного управления висят в воздухе? К плате придирок вроде не должно быть...
Ответить

Вернуться в «Разные вопросы по МК»