LAPORAN AKHIR 1



Percobaan 8

PICO TRUE MASTER SPI

1. Prosedur[Kembali]

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

STM32F103C8 board – Microscale
2. Raspberry Pi Pico

3. LCD OLED

4. Push Button

5. Breadboard

6. Resistor

Diagram Blok:

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)

 

5. Video Demo[Kembali]


6. Analisa[Kembali]



7. Download File[Kembali]























Komentar

Postingan populer dari blog ini