Но теперь у меня проблема: в начале передачи данных у меня происходит быстрое изменение 101 в часах, которых там быть не должно. Похоже, тактовый сигнал хочет измениться (как и должно быть в моем режиме SPI), но вынужден вернуться. Это происходит всегда после 8 бит.
Это мой код для конкретных данных:
Код: Выделить всё
using System;
using NationalInstruments.DAQmx;
using FTD2XX_NET;
class Program
{
static void Main(string[] args)
{
try
{
FTDI ftdiDevice = new FTDI();
FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
ftStatus = ftdiDevice.OpenByIndex(0);
if (ftStatus != FTDI.FT_STATUS.FT_OK)
{
Console.WriteLine("ERROR Opening");
return;
} else
{
Console.WriteLine("opend");
}
// Set MPSSE-Mode for SPI
ftStatus = ftdiDevice.SetBitMode(0x00, FTDI.FT_BIT_MODES.FT_BIT_MODE_MPSSE);
if (ftStatus != FTDI.FT_STATUS.FT_OK)
{
Console.WriteLine("ERROR set MPSSE");
ftdiDevice.Close();
return;
} else
{
Console.WriteLine("MPSSE set");
}
// Set baudrate
ftStatus = ftdiDevice.SetBaudRate(9600);
if (ftStatus != FTDI.FT_STATUS.FT_OK)
{
Console.WriteLine("Failed to set baud rate");
return;
}
// Send MPSSE-commands to configure SPI-mode
byte[] initCommands = new byte[]
{
0x8A, // Disable divide by 5
0x97, // Turn off adaptive clocking
0x8D, // Disable 3-phase clocking
0x85, //deaktiviert loopback
0x86, 0x2C, 0x01, // Set clock divisor
};
uint bytesWritten = 0;
ftStatus = ftdiDevice.Write(initCommands, initCommands.Length, ref bytesWritten);
if (ftStatus != FTDI.FT_STATUS.FT_OK || bytesWritten != initCommands.Length)
{
Console.WriteLine("ERROR init.");
ftdiDevice.Close();
return;
}
else
{
Console.WriteLine("Init sent");
bytesWritten = 0;
}
while (true)
{
byte[] setGPIO = new byte[] // activate the Chip Select
{
0x80, 0b11101111, 0b11111011
};
ftStatus = ftdiDevice.Write(setGPIO, setGPIO.Length, ref bytesWritten);
if (ftStatus != FTDI.FT_STATUS.FT_OK || bytesWritten != setGPIO.Length)
{
Console.WriteLine("ERROR set GPIO");
return;
}
byte[] testData = new byte[]
{
0x11, 0x02, 0x00, 0xAA, 0xAA, 0xAA
};
ftStatus = ftdiDevice.Write(testData, testData.Length, ref bytesWritten);
if (ftStatus != FTDI.FT_STATUS.FT_OK || bytesWritten != testData.Length)
{
Console.WriteLine("ERROR write data");
return;
}
setGPIO[1] = 0b11111111; // deactivate the Chip Select
ftStatus = ftdiDevice.Write(setGPIO, setGPIO.Length, ref bytesWritten);
if (ftStatus != FTDI.FT_STATUS.FT_OK || bytesWritten != setGPIO.Length)
{
Console.WriteLine("Fehler beim GPIO setzen");
return;
}
Console.WriteLine("FERTIG");
string input = Console.ReadLine();
if (input == "end") { break;}
}
// Schließen Sie das Gerät
ftdiDevice.Close();
}
catch (DaqException ex)
{
Console.WriteLine("FTDI Error: " + ex.Message);
}
Console.WriteLine("ENDE");
}
}
передача размером более 1 байта
Измерения с помощью различных осциллографов и цифровых или аналоговых пробников не помогли.
Разные тестовые данные всегда приносили один и тот же результат
Снижение тактовой частоты не помогло
Я не уверен, является ли это программной проблемой в моем коде C# и управлении чипом или если это аппаратная проблема с моим адаптером
Подробнее здесь: https://stackoverflow.com/questions/790 ... hm-ddhsl-0