SPI通信同期変更
code:c
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
// GPIOピンの設定
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
// SPIクロックモードの設定
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // 初回は立下り同期に設定
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
}
int main(void)
{
// クロック設定の構成
RCC_DeInit();
SystemInit();
// SPIの初期化
SPI1_Init();
// 初回通信(立下り同期)
SPI1->CR1 &= ~SPI_CR1_SPE; // SPIを無効にする
SPI1->CR1 &= ~SPI_CR1_CPOL; // CPOLをLowに設定
SPI1->CR1 |= SPI_CR1_SPE; // SPIを有効にする
// ここに1回目のSPI通信の処理を書く
// 2回目通信(立ち上がり同期)
SPI1->CR1 &= ~SPI_CR1_SPE; // SPIを無効にする
SPI1->CR1 |= SPI_CR1_CPOL; // CPOLをHighに設定
SPI1->CR1 |= SPI_CR1_SPE; // SPIを有効にする
// ここに2回目のSPI通信の処理を書く
while (1)
{
// ここに何らかの処理を書く
}
}
HALドライバを使用している場合
code:c
/* SPI1を立ち上がり同期に変更する */
hspi1.Instance->CR1 &= ~SPI_CR1_SPE; // SPI1を無効にする
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; // クロック極性
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // クロック位相
HAL_SPI_Init(&hspi1); // SPI1の初期化を行う
hspi1.Instance->CR1 |= SPI_CR1_SPE; // SPI1を有効にする
/* SPI1を立下り同期に変更する */
hspi1.Instance->CR1 &= ~SPI_CR1_SPE; // SPI1を無効にする
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // クロック極性
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // クロック位相
HAL_SPI_Init(&hspi1); // SPI1の初期化を行う
hspi1.Instance->CR1 |= SPI_CR1_SPE; // SPI1を有効にする