// ͬ��ģ��ӿ�����(GPIOģ��spi�ӿ�)-ʵ�ֽӿڶ�дʱ��
// ������Ѱ�Ƽ����޹�˾
// ����
// 2023-09-30
// spi4���ƣ�ģʽ0
// ע�⣺��ʹ�ö�д�ӿ�ǰ�����ȸ�����Ŀ����ʹ��GPIO�ܽ��滻ͷ�ļ��е�12����

#include "includes.h"

// дƬѡ�ź�
// byBitValue:Ƭѡ�źţ�ֻ����0����1
// ע�⣺ÿһ��SPI����Ҫ����һ������
void driver_syncspi_wr_cs(uint8 byBitValue)
{
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_CS_PORT, DRIVER_SYNC_SPIGPIO_CS_PIN, (BitAction)byBitValue);
    return;
}

// дʱ��
// byBitValue:ֻ����0����1
void driver_syncspi_wr_sck(uint8 byBitValue)
{
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_SCK_PORT, DRIVER_SYNC_SPIGPIO_SCK_PIN, (BitAction)byBitValue);
    return;
}

// дMOSI
// byBitValue:ֻ����0����1
void driver_syncspi_wr_mosi(uint8 byBitValue)
{
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_MOSI_PORT, DRIVER_SYNC_SPIGPIO_MOSI_PIN, (BitAction)byBitValue);
    return;
}

// ��MISO
uint8 driver_syncspi_rd_miso()
{
    return GPIO_ReadInputDataBit(DRIVER_SYNC_SPIGPIO_MISO_PORT, DRIVER_SYNC_SPIGPIO_MISO_PIN);
}

// ͬ��оƬӲ��λ
void driver_syncspi_reset()
{
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_RESET_PORT, DRIVER_SYNC_SPIGPIO_RESET_PIN, (BitAction)0x01);
    driver_delay_nxus(200);
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_RESET_PORT, DRIVER_SYNC_SPIGPIO_RESET_PIN, (BitAction)0x00);
    driver_delay_nxus(200);
}

// ��ʼ��SPI�ӿ����õ���GPIO�ܽ�
// ע�⣺����ܽ���Ҫ������Ŀȷ��
void driver_syncspi_init()
{
    GPIO_InitTypeDef stGpio = {0};

    // ��֯GPIO��������
    stGpio.GPIO_Speed = GPIO_Speed_25MHz;
    stGpio.GPIO_PuPd = GPIO_PuPd_NOPULL;

    // ��ʼ��CS
    RCC_AHB1PeriphClockCmd(DRIVER_SYNC_SPIGPIO_CS_CLK, ENABLE);
    stGpio.GPIO_Mode = GPIO_Mode_OUT;
    stGpio.GPIO_OType = GPIO_OType_PP;
    stGpio.GPIO_Pin = DRIVER_SYNC_SPIGPIO_CS_PIN;
    GPIO_Init(DRIVER_SYNC_SPIGPIO_CS_PORT, &stGpio);

    // ��ʼ��SCK
    RCC_AHB1PeriphClockCmd(DRIVER_SYNC_SPIGPIO_SCK_CLK, ENABLE);
    stGpio.GPIO_Mode = GPIO_Mode_OUT;
    stGpio.GPIO_OType = GPIO_OType_PP;
    stGpio.GPIO_Pin = DRIVER_SYNC_SPIGPIO_SCK_PIN;
    GPIO_Init(DRIVER_SYNC_SPIGPIO_SCK_PORT, &stGpio);

    // ��ʼ��MOSI
    RCC_AHB1PeriphClockCmd(DRIVER_SYNC_SPIGPIO_MOSI_CLK, ENABLE);
    stGpio.GPIO_Mode = GPIO_Mode_OUT;
    stGpio.GPIO_OType = GPIO_OType_PP;
    stGpio.GPIO_Pin = DRIVER_SYNC_SPIGPIO_MOSI_PIN;
    GPIO_Init(DRIVER_SYNC_SPIGPIO_MOSI_PORT, &stGpio);

    // ��ʼ��MISO
    RCC_AHB1PeriphClockCmd(DRIVER_SYNC_SPIGPIO_MISO_CLK, ENABLE);
    stGpio.GPIO_Mode = GPIO_Mode_IN;
    // stGpio.GPIO_OType = GPIO_OType_OD;
    stGpio.GPIO_Pin = DRIVER_SYNC_SPIGPIO_MISO_PIN;
    GPIO_Init(DRIVER_SYNC_SPIGPIO_MISO_PORT, &stGpio);

    // ��ʼ��Ӳ��λ�ܽ�
    RCC_AHB1PeriphClockCmd(DRIVER_SYNC_SPIGPIO_RESET_CLK, ENABLE);
    stGpio.GPIO_Mode = GPIO_Mode_IN;
    // stGpio.GPIO_OType = GPIO_OType_OD;
    stGpio.GPIO_Pin = DRIVER_SYNC_SPIGPIO_RESET_PIN;
    GPIO_Init(DRIVER_SYNC_SPIGPIO_RESET_PORT, &stGpio);
    GPIO_WriteBit(DRIVER_SYNC_SPIGPIO_RESET_PORT, DRIVER_SYNC_SPIGPIO_RESET_PIN, (BitAction)0x00);

    // ����Ĭ��ֵ��ģʽ0��
    driver_syncspi_wr_cs(1);  // Ƭѡ����
    driver_syncspi_wr_sck(0); // ʱ������
    driver_delay_nxms(10);

    return;
}

// ����SPI�ź�
void driver_syncspi_spi_start()
{
    driver_syncspi_wr_cs(0); // ѡ��SPI
    driver_delay_nxus(10);

    return;
}

// ֹͣSPI�ź�
void driver_syncspi_spi_stop()
{
    driver_delay_nxus(10);
    driver_syncspi_wr_cs(1); // ��ѡ��SPI

    return;
}

// ����һ���ֽ�(��д����)
// spiģʽ0����Ҫ�޸ĳ�����ģʽ����Ҫ������λ���߼���
uint8 driver_syncspi_exchange_byte(uint8 byData)
{
    uint8 byReceiveData = 0;
    uint8 bySendTmp = 0;
    uint8 byReceiveTmp = 0;

    // ��������
    for (uint8 i = 0; i < 8; i++)
    {
        // ��������
        bySendTmp = byData & (0x80 >> i);
        driver_syncspi_wr_mosi(bySendTmp);

        // ʱ�Ӳ���������
        driver_syncspi_wr_sck(1);

        // ���մӻ�����
        byReceiveTmp = driver_syncspi_rd_miso();
        if (byReceiveTmp == 1)
        {
            byReceiveTmp = 0x80 >> i;
            byReceiveData |= byReceiveTmp;
        }

        // ʱ�Ӳ����½���
        driver_syncspi_wr_sck(0);
    }

    return byReceiveData;
}