Нет, это не работает. Я с bitcentury общался
Пацаны, в этой теме,
пост #77 -
t309 привёл-полезный копипаст
там про инструкции для того, чтобы объединить в цепочку чипы в коде, по-разрядном уровне, кто точно переведёт?
t309 от кого инфа? Bitfury? надо по русски эту инфу... плизз))))
..................вольный перевод:
Позвольте мне объяснить протокол.
Это не в реальном времени - готовьте объемный буфер, тогда выполните, передача-приём работают, сохраняют в буфер и затем анализируют его.
Таким образом, нужно использовать 32-разрядный SPI, в то время как данные могли быть выровненные по-другому во фреймах.
Последовательность СБРОСА SPI - повышением SCK переключают MOSI - который обработан как команда сброса и значение по умолчанию, передаёт цепочке микросхем (т.е. вводы IN соеденины с выводами OUT - микросхемы объединены в цепочку),
Дальше - инструкции для того, чтобы объединить в цепочку принятый на разрядном уровне
0 - NOP - нет инструкций и игнорируется
100 - 'повреждённая' цепочка - она сначала передана через целую цепочку, и затем - на заключительной цепочке такта поврежден.
101 - устанавливает асинхронную цепочку к следующей микросхеме - вся заливка SPI быть переданными, чтобы затем внести цепочку
110 - устанавливает синхронную цепочку к следующей микросхеме - то же как асинхронную, но с дополнительными регистрами для данных - биты будут задержаны 2 на выходе! поэтому дайте дополнение NOP фрейму длинных цепочек
111 - Инструкция ДАННЫХ
инструкция данных содержит 1 байт, у которого есть длина 32-битное слово и 16-битный адрес
Так в единственном фрейме можете получить доступ к любой микросхеме и выполнить передачу данных к ее внутренним адресам и получить результат, используя emit_data функцию.
Для того, чтобы протестировать цель - просто повреждают цепочку после сброса начинают говорить с ПЕРВОЙ микросхемой ВСЕГДА.
СБРОС SPI - подпрограмма синхронизации, потому что микросхема не имеет глобального асинхронного сброса и запускается в неопределенном состоянии. Довольно безопасно, но только на передачу, чтобы обнулить переполнение счетчиков внутри и добраться "в синхронизации" с однокристальной схемой.
----- Communication code snippet ----
unsigned char spibuf[16384]; /* Spi output buffer */
unsigned spibufsz = 0; /* Spi buffer size in bytes */
unsigned nonemit_value[128];
unsigned nonemit_pos[128];
unsigned nonemit_last = 0;
void emit_buf_reverse(const char *str, unsigned sz)
{
unsigned i;
for (i = 0; i < sz; i++) { // Reverse bit order in each byte!
unsigned char p = str;
p = ((p & 0xaa)>>1) | ((p & 0x55) << 1);
p = ((p & 0xcc)>>2) | ((p & 0x33) << 2);
p = ((p & 0xf0)>>4) | ((p & 0x0f) << 4);
spibuf[spibufsz+i] = p;
}
spibufsz += sz;
printf("Adding %u to %u bytes (reverse)\n", sz, spibufsz);
}
void emit_buf(const char *str, unsigned sz)
{
unsigned i;
memcpy(&spibuf[spibufsz], str, sz); spibufsz += sz;
printf("Adding %u to %u bytes\n", sz, spibufsz);
}
void emit_break(void) { emit_buf("\x4", 1); }
void emit_fsync(void) { emit_buf("\x6", 1); }
void emit_fasync(void) { emit_buf("\x5", 1); }
void emit_data(uint16_t addr, const char *buf, uint16_t len)
{
unsigned char otmp[3];
if (len < 4 || len > 128) return; /* This cannot be programmed in single frame! */
len /= 4; /* Strip */
otmp[0] = (len - 1) | 0xE0;
otmp[1] = addr >> 8; otmp[2] = addr & 0xFF;
emit_buf(otmp, 3);
emit_buf_reverse(buf, len*4);
}
-------------------------------
arlumba - как успехи? GND под чипом можно сверлом на 4,5..5мм просвелить и залудить (припаять) на нижний слой земли, толстый-земля это важно, затем скорость хэширования посмотри...