ソースに最低限必要な記述
#include "pico/stdlib.h"
#include "hardware/dma.h"
#include "hardware/spi.h"
#define LCD_SPI spi1
// ピンの設定(自分の環境に合わせて適宜変更してください)
#define PIN_SCK 10 // 使用するピン番号に合わせて変更
#define PIN_MOSI 11
int main() {
// SPIの初期化(一部の設定は省略しています)
spi_init(LCD_SPI, 1 * 1000 * 1000); // 例:1MHz
gpio_set_function(PIN_SCK, GPIO_FUNC_SPI);
gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);
uint8_t data[] = {0xAA, 0xBB, 0xCC}; // 転送元バッファ
int dma_ch = dma_claim_unused_channel(true); // 1:DMAチャンネルを取得
dma_channel_config cfg = dma_channel_get_default_config(dma_ch); // 2:設定用構造体を取得
channel_config_set_transfer_data_size(&cfg, DMA_SIZE_8); // 3:データサイズを8bitに設定
channel_config_set_read_increment(&cfg, true); // 4:読み元(data[])はポインタ加算
channel_config_set_write_increment(&cfg, false); // 5:書き先(SPI)は固定
dma_channel_configure(
dma_ch, // DMAチャンネル番号
&cfg, // 設定
&spi_get_hw(LCD_SPI)->dr, // 6:書き込み先:SPIの送信レジスタ
data, // 7:読み込み元データ
sizeof(data), // 転送バイト数
true // 即時スタート
);
dma_channel_wait_for_finish_blocking(dma_ch); // 8:転送完了までブロック
dma_channel_unclaim(dma_ch); // 9:チャンネル解放
//
}
番号 | 項目 | 説明 |
---|
① | DMAチャンネル取得 | dma_claim_unused_channel(true) :未使用チャンネルを自動取得 |
② | 構成取得 | dma_channel_get_default_config() :初期設定を取得 |
③ | 転送単位の設定 | 8bit, 16bit, 32bitとかを設定 |
④ | 読み元のポインタ加算 | true でdata[]を1byteずつ読む |
⑤ | 書き先のポインタ固定 | false でSPI送信レジスタに繰り返し書く |
⑥ | 書き先アドレス | spi_get_hw(spi1)->dr :SPI送信レジスタ |
⑦ | 読み元アドレス | 転送したい配列 |
⑧ | 転送完了まで待機 | 完了前に次の処理を始めないための待機処理 |
⑨ | チャンネル解放 | 他の用途に使うために解放 |
CMakeLists.txt に最低限必要な記述
target_link_libraries(プロジェクト名
pico_stdlib
hardware_dma
hardware_spi
)
関連
コメント