LAPORAN AKHIR 1
Percobaan 8
PICO TRUE MASTER SPI
1. Persiapkan semua alat dan bahan yang diperlukan.
2. Rangkai semua komponen pada breadboard yang telah disediakan.
3. Download stlink pada laptop, lalu masukkan listing program ke aplikasi STM32 CubeIDE.
4. Rangkaian dihubungkan ke laptop dengan kabel stlink dan dirunning.
5. Buat program di Thonny, jalankan program dan inputkan program.
6. Amati hasilnya, apakah output sesuai dengan program yang diinputkan.
7. Selesai.
.
2. Hardware dan Diagram Blok[Kembali]
Hardware:
1. STM32F103C8

6. Resistor
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
Rangkaian Simulasi:
Prinsip Kerja:
Prinsip kerja rangkaian ini adalah sebagai berikut:
Raspberry Pi Pico berfungsi sebagai pengendali utama yang mengolah data dari input dan mengirimkan sinyal kendali. Tiga push button digunakan sebagai input manual yang dapat mendeteksi tindakan pengguna, seperti menekan tombol untuk memberikan perintah tertentu. Raspberry Pi Pico membaca sinyal dari tombol tersebut melalui pin digitalnya. Data yang dihasilkan oleh Raspberry Pi Pico dikirimkan ke STM32 untuk pemrosesan lanjutan, jika diperlukan, menggunakan komunikasi serial atau protokol lainnya. STM32 juga dapat berfungsi sebagai pengendali tambahan untuk tugas-tugas spesifik yang lebih kompleks. Selain itu, Raspberry Pi Pico mengendalikan OLED display untuk menampilkan informasi seperti status sistem, output data, atau pesan tertentu kepada pengguna. Dengan demikian, seluruh komponen bekerja secara terintegrasi untuk menerima input, memprosesnya, dan memberikan feedback berupa informasi yang ditampilkan di layar OLED.
4. Flowchart dan Listing Program[Kembali]
Flowchart:
Listing Program:
- STM32
#include "stm32f1xx_hal.h"
SPI_HandleTypeDef hspi1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
uint8_t
button_states[3] = {0}; // Format: [Merah, Hijau, Biru]
while (1) {
// Baca tombol
(logika terbalik karena pull-up)
button_states[0] =
!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12); // Merah
button_states[1] =
!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13); // Hijau
button_states[2] =
!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14); // Biru
// Transmisi SPI
(hanya kirim via MOSI)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // CS LOW
HAL_SPI_Transmit(&hspi1, button_states, 3, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // CS HIGH
HAL_Delay(100); //
Delay untuk stabilitas
}
}
void SystemClock_Config(void) {
RCC_OscInitTypeDef
RCC_OscInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 8MHz x9 = 72MHz
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitTypeDef
RCC_ClkInitStruct = {0};
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCL
K1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_2);
}
void MX_SPI1_Init(void) {
hspi1.Instance =
SPI1;
hspi1.Init.Mode =
SPI_MODE_MASTER;
hspi1.Init.Direction
= SPI_DIRECTION_1LINE; // Hanya MOSI
hspi1.Init.DataSize
= SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase
= SPI_PHASE_1EDGE;
hspi1.Init.NSS =
SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 4.5MHz
@72MHz
hspi1.Init.FirstBit
= SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi1);
}
void MX_GPIO_Init(void) {
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// Konfigurasi
tombol (PB12, PB13, PB14)
GPIO_InitTypeDef
GPIO_InitStruct = {0};
GPIO_InitStruct.Pin
= GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode
= GPIO_MODE_INPUT;
GPIO_InitStruct.Pull
= GPIO_PULLUP;
HAL_GPIO_Init(GPIOB,
&GPIO_InitStruct);
// Konfigurasi SPI
(PA5=SCK, PA7=MOSI)
GPIO_InitStruct.Pin
= GPIO_PIN_5|GPIO_PIN_7;
GPIO_InitStruct.Mode
= GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,
&GPIO_InitStruct);
// Konfigurasi CS
(PA4)
GPIO_InitStruct.Pin
= GPIO_PIN_4;
GPIO_InitStruct.Mode
= GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA,
&GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
- Raspberry Pi Pico
import machine
from machine import Pin, SoftI2C
import ssd1306
from rp2 import PIO, StateMachine, asm_pio
from time import sleep
# ------ OLED Setup ------
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("SPI SLAVE READY", 0, 20)
oled.show()
# ------ SPI Slave PIO ------
@asm_pio(autopush=True, push_thresh=8)
def spi_slave():
wait(0, pin,
0) # Wait for CS LOW
set(x, 7) # Setup counter (8 bits)
label("bitloop")
in_(pins, 1) # Read MOSI (GP3)
jmp(x_dec,
"bitloop") # Loop 8
times
push(block) # Push byte to FIFO
wait(1, pin,
0) # Wait for CS HIGH
sm = StateMachine(0, spi_slave,
freq=4_500_000,
in_base=Pin(3), # GP3
= MOSI
jmp_pin=Pin(1)) # GP1
= CS
sm.active(1)
# ------ Main Loop ------
# Ganti loop utama di Pico dengan ini:
while True:
if sm.rx_fifo()
>= 3:
data =
[sm.get() for _ in range(3)]
print("SLAVE:", data) #
Harus tampil [1, 2, 3]
# Tampilkan
semua data (termasuk 0)
oled.fill(0)
oled.text(f"data diterima", 0, 20)
oled.show()
sleep(0.1)
Komentar
Posting Komentar