Post
Topic
Board Майнеры
Re: [Применение чипов Bitfury], схемные решения и т.п.
by
dimitrus
on 16/10/2013, 17:07:17 UTC
SPI<>UART<>USB например FTDI
я в python использовал libftd2xx.so.1.1.12 пробовал и serial, но чип так и не ответил. Но есть сомнение что он впаян ровно.
код тут http://pastebin.com/2Uct1W76
Какой именно ftdi?
Чип нужно прозвонить на КЗ, потом подать питание, на чипе появится на ноге MISO логическая 1.
Вам всем нужен анализатор, тогда быстро все заведете. Я давал ссылку как его самому быстро и дешево собрать или готовый купите.
Я так же выкладывал дамп обмена, чип нужно проинициализировать, потом он начнет генерить меандр на MISO. Ну и т.д.
А чего он отвечать должен, если ты ерунду заливаешь или ты не все показал? Что у тебя с чипом общается?
Изучаем картинки, открывайте их в другом окне, будет больше разрешение.





В общем, вот кусок старой прошивки под STM8S003, код примитивный до ужаса Smiley Будет работать в связке с cp2102,pl2303,ft232r ну или max232 Smiley
В ней поменял только скорость порта на 576000, не путать с 57600.
Code:
#include
#include "stm8s.h"

void Delay (uint32_t nCount);

void spi_reset(void)
{
        uint8_t i;

        SPI_Cmd(DISABLE);
        GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
for (i = 0; i < 8; i++) {
               GPIO_WriteReverse(GPIOC,GPIO_PIN_6);
}
        SPI_Cmd(ENABLE);
}


#define SPIMAXSZ 450

static uint8_t spibuf[SPIMAXSZ], spibuf_rx[SPIMAXSZ];
static uint16_t spibufsz;

void spi_clear_buf(void) { spibufsz = 0; }
uint8_t *spi_getrxbuf(void) { return spibuf_rx; }
uint8_t *spi_gettxbuf(void) { return spibuf; }
uint16_t spi_getbufsz(void) { return spibufsz; }

int spi_txrx(const uint8_t *wrbuf, uint8_t *rdbuf, uint16_t bufsz)
{
uint16_t i;

for (i = 0; i < bufsz; i++) {
                SPI_SendData(wrbuf[i]);
                while (SPI_GetFlagStatus(SPI_FLAG_TXE)== RESET);
                while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);
                rdbuf[i] = SPI_ReceiveData();
        }
        return 0;
}


int uart_tx(const uint8_t *rxbuf, uint16_t bufsz)
{
unsigned i;
       
for (i = 0; i < bufsz; i++) {
                UART1_SendData8(rxbuf[i]);
                while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
        }
        return 0;
}

int uart_rx(uint8_t *rxbuf, uint16_t bufsz)
{
unsigned i;
        uint16_t t=0;
        spibufsz = SPIMAXSZ;
for (i = 0; i < spibufsz; i++) {
                while (UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET)
                {
                  if (t<5) t++;
                  else {
                    if (i!=0) spibufsz=i;else spibufsz=0;
                    return 0;
                  }
                }
                t=0;
                rxbuf[i] = UART1_ReceiveData8();
        }
        spibufsz = i;
        return 0;
}


void main(void)
{
  CLK_DeInit();

    /* Configure the Fcpu to DIV1*/
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
   
    /* Configure the HSI prescaler to the optimal value */
  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);

  CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);

  GPIO_DeInit(GPIOC);
  GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_IN_FL_NO_IT);
  GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_FAST);
  GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST);

  UART1_DeInit();
 
  UART1_Init((uint32_t)576000, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
              UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

  UART1_Cmd(ENABLE);
 
  SPI_DeInit();
  SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_8, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
           SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT,(uint8_t)0x07);
  SPI_Cmd(DISABLE);
   
  uart_tx("\x88",1);

  uint32_t t;
  BitStatus pin;

  while (1)
    {
      uart_rx(spi_gettxbuf(),spi_getbufsz());
      if(spibufsz>0) {

         for(t=0;t<1000;t++) {
             pin = GPIO_ReadInputPin(GPIOC, GPIO_PIN_7);
             if (pin==0) {break;}
         }

         spi_reset();
         spi_txrx(spi_gettxbuf(), spi_getrxbuf(), spi_getbufsz());         
         uart_tx("\x88",1);
         uart_tx(spi_getrxbuf(),spi_getbufsz());
      }
    }
}

void Delay(uint32_t nCount)
{
    while (nCount != 0)
    {
        nCount--;
    }
}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{
  while (1)
  {
  }
}
#endif