Cara mendapatkan lebih dari satu antarmuka uart


30

Oke, saya punya satu antarmuka uart (TXD GPIO 14, RXD GPIO 15). Saya ingin setidaknya satu antarmuka lagi.

Solusi yang memungkinkan:

  • Bit banging: Gunakan dua GPIO cadangan yang tidak terkait. Saya mengerti bahwa waktu adalah masalah pada linux standar. Apakah bisa diandalkan dengan baudrate sangat rendah?

  • Berpindah: RPI memutuskan kapan untuk berbicara ke perangkat mana. Menggunakan misalnya CD4066BC .

  • spi to 2 x uart bridge: Tidak menemukan bagian yang cocok (ketersediaan, harga, paket dil)

  • usb to uart: Mahal

Apakah ada opsi lain? Saya cenderung beralih, jika itu bisa dilakukan. Apa yang akan Anda sarankan?


Jawaban:


10

USB UART, seperti FTDI, tidak terlalu mahal. Semua opsi Anda yang lain terdengar seperti mereka akan dikenakan biaya lebih banyak di bagian dan waktu daripada ~ $ 13 mungkin biaya Anda, dan tidak dapat diandalkan atau lambat. Pilih saja opsi cepat dan bebas masalah, seperti:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun juga menjual satu. Bahkan, mungkin Anda bisa menarik satu dari beberapa perangkat USB lama atau membelinya dari toko sampah yang tidak tahu apa fungsinya.

Saya mengacaukan adaptor SPI ke UART untuk proyek Arduino, tidak ada perpustakaan jadi saya menulis sendiri. Pada akhirnya itu bekerja dengan baik, tetapi jika saya bisa saja menjatuhkan bagian $ 15 saya akan melakukannya. Bahkan mengingat waktu itu biaya saya, saya seharusnya hanya punya mega dengan 4 port serial.

Atau jika Anda menginginkan banyak port serial, Anda bisa melihat RS485 serial, yang mirip dengan 232 (meskipun tidak kompatibel), yang mendukung multi-drop, yaitu beberapa antarmuka pada satu baris.


1
Opsi ini juga memudahkan dari sudut pandang perangkat lunak. FTDI memiliki dukungan driver Linux di luar kotak. Semua opsi lain akan membutuhkan pekerjaan pengemudi yang melelahkan.
Ber

Cp2102 adalah chip uart usb favorit saya. Pencarian amazon cepat mengungkapkan mereka untuk $ 6,99 (sebenarnya $ 1,50) dengan kabel termasuk! Tidak bisa mengalahkan itu!
portforwardpodcast

6

Jika Anda memutuskan untuk tidak menambahkan perangkat keras tambahan dan langsung menggunakan bit-banging route, ini tidak sesulit seperti yang digambarkan oleh sebagian orang.

Pertama, utas komunikasi Anda harus langsung:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

Mulai sekarang, utas Anda tidak akan dipersiapkan untuk 950 ms dari setiap detik * , kecuali jika ia mengembalikan kontrol dengan sukarela (melalui sched_yield(), atau usleep()) secara tepat waktu, yang tidak akan membuatnya pre-empted selamanya. Dengan 850MHz CPU, bit-banging loop Anda akan berjalan idle hampir sepanjang waktu bahkan pada kecepatan tercepat.

Sayangnya, persyaratan untuk mengembalikan kontrol dari waktu ke waktu berarti ketika utas Anda tertidur, apa pun yang dikirim "pihak lawan" Anda, akan hilang selamanya. Tetapi untuk tujuan itu Anda dapat menggunakan kontrol transmisi. Baik mengalokasikan lebih banyak GPIO untuk jalur CTS yang Anda tarik sebelum menghasilkan dan membuat cadangan setelah memulihkan kontrol:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

atau (IMHO lebih disukai) menggunakan kontrol transmisi XON / XOFF - kirim karakter XOFF melalui RS232 sebelum tidur, XON setelah Anda melanjutkan operasi. Kode ASCII default untuk ini adalah '\x13'untuk XOFF / "berhenti mengirim" dan '\x11'untuk XON / "melanjutkan pengiriman".

Tentu saja perangkat jarak jauh Anda harus mematuhinya. Jika tidak, beberapa data akan hilang.


4

Saya menemukan apa yang Anda cari: seorang budak I2C / SPI ke jembatan UART / IrDA / GPIO.

Mereka datang dalam versi tunggal dan ganda (jadi 1 atau 2 UART tambahan). Mereka (NXP) juga (untuk pihak lain jika diperlukan) memiliki master I2C / SPI ke jembatan UART / IrDA / GPIO.

Informasi lebih lanjut dapat ditemukan tentang chip ini di sini dan mitra utama .

Maxim juga memiliki chip yang melakukan hal yang persis sama.


Info bagus, tetapi tautan NXP memberikan HTTP 403 di sini.
Tom

Berikut datasheet yang relevan: nxp.com/documents/data_sheet/SC16IS752_SC16IS762.pdf ?
Tom

3

Jembatan USB ke UART murah dan tersedia, tetapi memiliki karakteristik pengaturan waktu yang sangat buruk. Newark menjual papan "Embedded Pi" yang memiliki prosesor STM32F ARM tempat Anda dapat menulis kode bare-metal. Chip itu memiliki tiga UART di atasnya, dan saya pikir mereka bisa berjalan sangat cepat; jika Anda menggunakan satu untuk berkomunikasi dengan Raspberry Pi yang akan meninggalkan dua tersedia untuk keperluan lain. Penafian: Saya telah membeli salah satu papan ini, tetapi belum menggunakan Raspberry Pi itu sendiri untuk menangani kebutuhan I / O secara langsung.

Jika Anda ingin banyak UART yang lebih lambat, STM32F pada board Pi Tertanam mungkin dapat menangani angka yang wajar, terutama jika Anda bersedia menulis beberapa bahasa rakitan Arm. Jika ada dua kelompok 16 pin I / O yang tersedia pada satu papan, dimungkinkan untuk memiliki 16 perangkat lunak UART simultan yang semuanya bekerja sekaligus dengan kecepatan baud yang cukup baik (memiliki interupsi berkala pada 3x atau 5x baud rate yang menyimpan Nilai latch 16-bit dari port terima ke buffer, dan output nilai 16-bit yang sudah dikomputasi dari buffer ke port transmit; jika Anda melakukan ini, maka berikan waktu servis rata-rata untuk perangkat lunak UART yang tidak terlalu besar, itu tidak masalah jika ada hit terburuk yang terjadi sesekali (mis. semua enam belas port menerima byte secara bersamaan).

Pendekatan ini sebenarnya dapat bekerja sangat efisien untuk menerima, karena kode "kasus umum" bahkan tidak harus melihat masing-masing UART. Misalkan Anda mengambil sampel data sebesar 5x, dan 47 byte terakhir dari buffer digandakan segera sebelum itu. Dengan asumsi data ditulis ke buffer dalam urutan menaik, Anda dapat memeriksa apakah byte telah diterima sepenuhnya di salah satu dari 16 saluran dengan hanya mengatakan:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

Jika bytes_readynol, tidak ada data yang diterima. Kalau tidak, jika mis. Bit 2 bytes_readydiset, itu berarti bahwa byte data yang diterima dapat ditemukan dalam bit 2 data [rx_ptr-40], data [rx_ptr-35], data [rx_ptr-30], dll. Sekali orang mengambil data, hapus bit 2 dari bersenjata_flag dan atur agar data diatur ulang setelah sekitar 44 sampel.

Pendekatan ini akan membutuhkan sedikit kerja pada sampel-sampel tersebut di mana satu byte data diterima sepenuhnya (dan berpotensi banyak pekerjaan jika semua 16 saluran memiliki satu byte data tiba sekaligus) tetapi pada sebagian besar sampel jumlah pekerjaan akan sangat sedikit. Jika seseorang memiliki 64 pin I / O, seseorang dapat menangani hingga 32 UART menggunakan pendekatan ini tanpa menambahkan pekerjaan tambahan untuk kasus "umum".


1

Sebuah mikrokontroler seperti Picaxe dapat mengambil data serial pada satu pin dan output data serial pada pin tertentu dengan tepat. Ini secara efektif akan memberi Anda lebih banyak keluaran serial jika Anda siap harus memberi tahu Picaxe yang mana pin untuk output. Bisa juga melakukan hal yang sama, tetapi secara terbalik, sehingga bisa menerima data serial dari beberapa perangkat dan mengirimkannya ke Raspberry Pi. Pilihan lain bisa jadi untuk membuat perangkat yang terhubung membutuhkan kualifikasi . Ini berarti bahwa Perangkat 1 harus menerima data 'd1', misalnya sebelum itu akan mendengarkan data lebih lanjut pada baris serial. Perangkat 2 dapat memiliki 'd2' sebagai kualifikasi. Ini berarti bahwa untuk mengatakan 'halo' ke Perangkat 1, Anda hanya perlu mengirim 'd1hello' di saluran UART.

Picax cukup murah, Anda bisa mendapatkannya di http://www.techsupplies.co.uk/ dan mereka datang dalam berbagai ukuran dengan jumlah pin yang berbeda dan sebagainya.


1

Jika komunikasi ke beberapa perangkat slave UART tidak perlu terjadi secara paralel, Anda dapat berbagi satu port UART yang tersedia di antara mereka. Anda dapat menggunakan transistor untuk hanya mengaktifkan koneksi RxD / TxD ke perangkat yang saat ini ingin Anda ajak bicara. Transistor ini dapat dikontrol oleh pin GPIO Raspberry Pi lainnya.




0

Saya menggunakan IC SC16IS752 yang merupakan konverter SPI ke 2xUART. Ini bekerja dengan baik dengan Peregangan Raspbian.

Ini sedikit lebih mahal daripada chip FTDI, tetapi ada dua uarts dan saya tidak harus menggunakan port USB yang berharga.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.