KFLOP - RS232
KFLOP содержит UART, который позволяет C программам пользователя выполнять последовательную связь с другими сторонними устройствами.
KFLOP содержит последовательный интерфейс UART, но не имеет схемы для согласования сигналов при уровнях напряжения +3 ... 25 В ... -3 ... -25 В, заданных стандартом RS232. Сигналы передачи и приема KFLOP являются логическими сигналами LVTTL 3,3 В.
Обратите внимание: сигналы, поступающие непосредственно от KFLOP, не совместимы с RS232. Подключение KFLOP напрямую к RS232 может привести плату к выходу из строя.
Плата Kanalog имеет преобразователь LVTTL(см. ниже).
KFLOP + Kanalog - RS232
Kanalog содержит преобразователь логических уровней KFLOP UART в стандартные уровни напряжения RS232. Сигналы RS232 доступны в JP10, который является стандартным разъемом RJ12.
Распиновка показана ниже. Распиновка рассчитана на совместимость с некоторыми устройствами ПЛК. Обратите внимание, что 6-жильный кабель должен быть заземлен через вывод 1.
KFLOP UART Software
FPGA KFLOP реализует программируемую скорость UART с двойной буферизацией 1 символа при передаче и приеме. Для использования UART необходимо использовать С программу пользователя KFLOP. Необходимо задать параметры для управления каким-либо конкретным устройством.
Программы пользователя KFlop с 1 активным потоком выполняются каждые 180US. (См. здесь для получения дополнительной информации). Это позволяет достичь скорости до 38400 бод без потерь данных (10 бит при 38400 Гц = 260 мкс). Передаваемые и принимаемые данные содержат 8 бит. Если требуется проверка четности, она должна обрабатываться программой пользователя.
Чтобы установить скорость передачи в бодах, введите 8-разрядный делитель скорости в регистр FPGA (RS232_BAUD_REG)
Для передачи 8-битовый символ записывается в регистр FPGA (RS232_DATA).
Чтобы получить символ, прочитайте 8-битное значение из регистра FPGA (RS232_DATA)
Регистр состояния (RS232_STATUS) предоставляет 2 бита статуса, которые можно использовать для определения, принят ли символ (RS232_DATA_READY), и есть ли возможность передать символ (RS232_TRANSMIT_FULL)
Следующие определения были добавлены в файл KMotionDef.h.
//RS232 FPGA Register Definitions
#define RS232_STATUS 0xc1 // Status Reg Address
#define RS232_DATA 0xc0 // 8 bit data read/write reg address
#define RS232_DATA_READY 0x01 // Data ready to read status mask
#define RS232_TRANSMIT_FULL 0x02// Transmit buffer full status mask
#define RS232_BAUD_REG 0xc1 // Set Baud rate 8-bit divisor Reg Address
#define RS232_BAUD_115200 ((16666666/115200/16)-1)// 8-bit divisor value to set
115200 baud
#define RS232_BAUD_57600 ((16666666/57600/16)-1) // 8-bit divisor value to set
57600 baud
#define RS232_BAUD_38400 ((16666666/38400/16)-1) // 8-bit divisor value to set
38400 baud
#define RS232_BAUD_19200 ((16666666/19200/16)-1) // 8-bit divisor value to set
19200 baud
#define RS232_BAUD_9600 ((16666666/9600/16)-1) // 8-bit divisor value to set
9600 baud
#define RS232_BAUD_4800 ((16666666/4800/16)-1) // 8-bit divisor value to set
4800 baud
Примечание, если KFLOP используется без Kanalog, выводы UART IO должны быть активированы, выполнив однократно следующую строку кода :
FPGA(KAN_TRIG_REG)=2;
Обратите внимание, что методы, показанные ниже, могут использоваться, но теперь доступен новый более простой и буферизованный метод. См. пример \C Programs\RS232\BufferedRS232.c
Пример передачи (RS232Send.c example)
#include "KMotionDef.h"
void SendChar(char c)
{
while (FPGA(RS232_STATUS) & RS232_TRANSMIT_FULL) ;
FPGA(RS232_DATA) = c;
}
main()
{
int i;
SetBitDirection(45,1);
FPGA(RS232_BAUD_REG) = RS232_BAUD_38400;
// FPGA(KAN_TRIG_REG) = 1; // enable Kanalog to get RS232
working
for (i=0;i<100;i++)
{
SendChar('A');
}
}
Пример приема (RS232Read.c example)
#include "KMotionDef.h"
void ReceiveChar()
{
// wait for data in buffer
while ((FPGA(RS232_STATUS) & 1)==0);
return FPGA(RS232_DATA);
}
main()
{
SetBitDirection(45,1);
FPGA(RS232_BAUD_REG) = RS232_BAUD_38400;
// FPGA(KAN_TRIG_REG) = 1; // enable Kanalog to get RS232
working
for (;;)
{
while ((FPGA(RS232_STATUS) &
RS232_DATA_READY) == 0) ;
printf("%X\n",ReceiveChar());
}
}