1. Tugas Pendahuluan [Kembali]
SOAl TUGAS PENDAHULUAN
1. Jelaskan apa itu
protokol komunikasi UART, SPI, dan I2C
Jawab:
·
UART (Universal Asynchronous Receiver Transmitter):
UART adalah protokol komunikasi serial asinkron
yang menggunakan dua jalur utama, yaitu TX (transmit) dan RX (receive). Tidak
menggunakan sinyal clock bersama, melainkan mengandalkan kecepatan baud rate
yang disepakati antara pengirim dan penerima. Banyak digunakan untuk komunikasi
jarak pendek antara mikrokontroler dan modul seperti GPS, Bluetooth, dan
komputer.
·
SPI (Serial Peripheral Interface):
SPI adalah protokol komunikasi serial sinkron yang
menggunakan empat jalur utama:
- MOSI
(Master Out Slave In)
- MISO
(Master In Slave Out)
- SCLK
(Serial Clock)
- SS/CS
(Slave Select/Chip Select)
SPI bersifat full-duplex dan
cepat, cocok untuk komunikasi antar-perangkat seperti sensor, EEPROM, atau
layar LCD. Hanya satu master yang mengontrol komunikasi dengan satu atau lebih
slave.
·
I2C (Inter-Integrated Circuit):
I2C
adalah protokol komunikasi serial sinkron yang menggunakan dua jalur utama:
- SDA (Serial Data Line)
- SCL (Serial Clock Line)
I2C memungkinkan satu master dan
banyak slave berbagi dua jalur komunikasi yang sama. Setiap slave memiliki
alamat unik. I2C sangat hemat pin dan ideal untuk sistem yang kompleks dengan
banyak perangkat.
2. Bagaimana konfigurasi
komunikasi UART pada STM32 dan Raspberry Pipico secara hardware (rangkaian)
maupun software (program)
Jawab:
STM32
TX : Pin PA9
RX : Pin PA10
Rangkaian dasar UART
STM32 ke USB-TTL (ex: CH340/FTD1)
STM32 PA9 (TX) --> RX USB-TTL
STM32 PA10 (RX) --> TX USB-TTL
GND STM32 --> GND USB-TTL
Contoh rangkaiannya:
Program
#include "main.h"
#include "stm32f1xx_hal.h"
#include <string.h>
// Inisialisasi handle UART
UART_HandleTypeDef huart1;
// Deklarasi fungsi
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
// Inisialisasi HAL
HAL_Init();
// Konfigurasi sistem
clock
SystemClock_Config();
// Inisialisasi GPIO dan
UART
MX_GPIO_Init();
MX_USART1_UART_Init();
// Pesan yang akan
dikirim
char msg[] = "Hello
from STM32 via UART!\r\n";
// Loop utama
while
(1)
{
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
HAL_Delay(1000);
// Delay 1 detik
}
}
// Konfigurasi USART1
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength =
UART_WORDLENGTH_8B;
huart1.Init.StopBits =
UART_STOPBITS_1;
huart1.Init.Parity =
UART_PARITY_NONE;
huart1.Init.Mode =
UART_MODE_TX_RX;
huart1.Init.HwFlowCtl =
UART_HWCONTROL_NONE;
huart1.Init.OverSampling
= UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
}
Raspberry Pi Pico
TX (transmit) : GPIO0
(UARTO TX)
RX (receive) : GPIO1
(UARTo RX)
Rangkaian dasar UART Pico
ke USB-TTL:
Pico GPIO0 (TX) --> RX USB-TTL
Pico GPIO1 (RX) --> TX USB-TTL
Pico GND --> GND USB-TTL
Program dengan kode
micropython:
from machine import
UART, Pin
import
time
# Inisialisasi UART0 dengan baudrate
9600
uart0 = UART(0,
baudrate=9600, tx=Pin(0),
rx=Pin(1))
# Loop utama
while True:
uart0.write('Hello
from Raspberry Pi Pico!\r\n')
time.sleep(1) # Delay selama 1 detik
3. Bagaimana konfigurasi
komunikasi SPI pada STM32 dan Raspberry Pipico secara hardware (rangkaian)
maupun software (program)
Jawab:
STM32
MOSI: Pin PA7
MISO: Pin PA6
SCK: Pin PA5
NSS (CS): Pin PA4
Contoh koneksi ke sensor
SPI (ex: nRF24L01)
STM32 PA5 (SCK) --> SCK nRF24L01
STM32 PA6 (MISO) --> MISO nRF24L01
STM32 PA7 (MOSI) --> MOSI nRF24L01
STM32 PA4 (NSS) --> NSS nRF24L01
STM32 3,3V --> VCC nRF24L01
STM32 GND --> GND nRF24L01
Rangkaian:
Program:
Inisialisasi SPI1:
// Deklarasi handle SPI
SPI_HandleTypeDef hspi1;
// Inisialisasi SPI1
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode =
SPI_MODE_MASTER;
// Mode Master
hspi1.Init.Direction =
SPI_DIRECTION_2LINES; // Full
duplex (2 lines)
hspi1.Init.DataSize =
SPI_DATASIZE_8BIT;
// Data 8-bit
hspi1.Init.CLKPolarity =
SPI_POLARITY_LOW; //
Clock idle state low
hspi1.Init.CLKPhase =
SPI_PHASE_1EDGE;
// Data valid on first clock edge
hspi1.Init.NSS =
SPI_NSS_SOFT;
// NSS dikontrol secara software
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // Prescaler
baudrate
hspi1.Init.FirstBit =
SPI_FIRSTBIT_MSB;
// MSB dikirim lebih dulu
hspi1.Init.TIMode =
SPI_TIMODE_DISABLE;
// Tidak menggunakan TI mode
hspi1.Init.CRCCalculation
= SPI_CRCCALCULATION_DISABLE; // CRC tidak digunakan
hspi1.Init.CRCPolynomial
= 10;
// Nilai CRC
polynomial (jika digunakan)
HAL_SPI_Init(&hspi1);
// Inisialisasi SPI dengan konfigurasi di atas
}
Contoh mengirim data via
SPI:
uint8_t data[] = {0xAA,
0x55};
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,
GPIO_PIN_RESET); // CS LOW
HAL_SPI_Transmit(&hspi1, data,
sizeof(data), HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,
GPIO_PIN_SET); // CS HIGH
Raspberry Pi Pico
SCK: Pin GPIO2
MOSI: Pin GPIO3
MISO: Pin GPIO4
CS: Pin GPIO5
Rangkaian koneksi antarmuka
periferal serial:
Koneksi ke sensor SPI
(ex: EEPROM SPI)
Pico GPIO2 (SCK) --> SCK EEPROM
Pico GPIO3 (MOSI) --> MOSI EEPROM
Pico GPIO4 (MISO) --> MISO EEPROM
Pico GPIO5 (CS) --> CS EEPROM
Pico 3,3V --> VCC EEPROM
Pico GND --> GND EEPROM
Program dengan micropython
from machine import
SPI, Pin
import
time
# SPI0 dengan default pin (SCK=2,
MOSI=3, MISO=4)
spi = SPI(0,
baudrate=1000000, polarity=0,
phase=0, bits=8,
firstbit=SPI.MSB,
sck=Pin(2), mosi=Pin(3),
miso=Pin(4))
cs = Pin(5,
Pin.OUT)
cs.value(1)
# CS HIGH (nonaktif)
while True:
cs.value(0)
# CS LOW (aktif)
spi.write(bytes([0x9F]))
# Contoh: baca JEDEC ID dari flash chip
cs.value(1)
time.sleep(1)
4. Bagaimana konfigurasi
komunikasi I2C pada STM32 dan Raspberry Pipico secara hardware (rangkaian)
maupun software (program)
Jawab:
STM32
SDA: Pin PB7
SCL: Pin PB6
Rangkaian I2C STM32 (ex:
OLED SSD1306)
STM32 PB6 (SCL) --> SCL perangkat I2C
STM32 PB7 (SDA) --> SDA perangkat I2C
STM32 3,3V --> VCC perangkat I2C
STM32 GND --> GND perangkat I2C
Program
Inisialisasi I2C1:
I2C_HandleTypeDef hi2c1;
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle =
I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode =
I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode =
I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode =
I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
}
Contoh mengirim data I2C
(misalnya menulis ke OLED/RTC):
uint8_t data[] = {0x00,
0xAE}; // perintah OLED:
Display OFF
HAL_I2C_Master_Transmit(&hi2c1, 0x78,
data, 2, HAL_MAX_DELAY);
Raspberry Pi Pico
SDA: Pin GPIO0
SCL: Pin GPIO1
Rangkaiannya:
Contoh koneksi ke sensor I2C
Pico GPIO0 (SDA) --> SDA perangkat
Pico GPIO1 (SCL) --> SCL perangkat
Pico 3,3V --> VCC perangkat
Pico GND --> GND perangkat
Program:
Contoh: scan alamat I2C
from machine import
I2C, Pin
import
time
i2c = I2C(0,
scl=Pin(1), sda=Pin(0),
freq=100000)
devices = i2c.scan()
print("I2C
devices found:", devices)
Contoh kirim data
(misalnya OLED SSD1306):
i2c.writeto(0x3C,
b'\x00\xAE') #
Display OFF command
Tidak ada komentar:
Posting Komentar