[学习笔记]

关于SPI读写时遇到的问题及解决方案

[复制链接]
695|0
手机看帖
扫描二维码
随时随地手机跟帖
jiuguang|  楼主 | 2021-4-23 10:50 | 显示全部楼层 |阅读模式
#技术资源# #申请原创# 首先,我们一般工程的时候用的读写位一般是8位,库函数是16位的。
第二,spi这个时序在读的时候要给他一个时钟,所以我们要写一个无关紧要的命令数据来确保我们读的时候有一个时钟。(因为SPI是全双工的方式而我们实际工程用的大都是半双工的所以我写的时候发和读是分开的)。
第三,初始化这一块我没有配置,是用代码生成器生成的,杰发科技的官网上有。配置的时候可以把CS脚那个地方不用硬件控制。
第一次写帖子,会有很多问题,欢迎讨论改正。
最后,附上代码希望对其他兄弟有一点点帮助。
这是初始化的代码
void SPI_Init()
{
        SPI_ConfigType spiConfig;
  memset(&spiConfig, 0, sizeof(spiConfig));

        GPIO_SetFunc(SPI1_SCK_PIN,  GPIO_FUNC_1);
        GPIO_SetFunc(SPI1_MISO_PIN, GPIO_FUNC_1);
        GPIO_SetFunc(SPI1_MOSI_PIN, GPIO_FUNC_1);
       
    spiConfig.sckHigh = 199;    //设置时钟频率的,这一块设置成125K的频率
    spiConfig.sckLow = 199;      
    spiConfig.setting.txEmptyIntEn = DISABLE;
    spiConfig.setting.rxFullIntEn = DISABLE;
    spiConfig.setting.txUnderflowIntEn = DISABLE;
    spiConfig.setting.rxOverflowIntEn = DISABLE;
    spiConfig.setting.master = 1;
    spiConfig.setting.modeErrorIntEn = DISABLE;
    spiConfig.setting.dmaTxEn = DISABLE;
    spiConfig.setting.dmaRxEn = DISABLE;
    spiConfig.setting.cpol = 1;
    spiConfig.setting.cpha = 1;
    spiConfig.setting.txMsbFirst = ENABLE;
    spiConfig.setting.rxMsbFirst = ENABLE;
    spiConfig.setting.frmSize = 7;
    spiConfig.setting.csOutputEn = DISABLE;
    spiConfig.setting.modeFaultEn = DISABLE;
    spiConfig.setting.continuousCSEn = DISABLE;
    spiConfig.setting.wakeUpEn = DISABLE;
    spiConfig.setting.spiEn = ENABLE;
    spiConfig.setting.swReset = 0;
    spiConfig.setting.intEn = DISABLE;
    SPI_Initialize(SPI1, &spiConfig);
}

//spi读写的API
uint8_t  spimTransferBytes(uint8_t wrBuf, uint16_t len)
{
        uint8_t rdBuf = 0;
  uint32_t  i = 0;

  if (!len)
  {
    return 0;
  }

  for (i = 0; i < len; i++)
  {
                while (!SPI_IsTxEF(SPI1));
    SPI1->DATA = wrBuf;
               
    while (!SPI_IsRxFF(SPI1));
                rdBuf = SPI_ReadDataReg(SPI1);
    //rdBuf = SPI1->DATA;
  }
        while ((SPI_IsBusy(SPI1)));
  SPI_CSRelease(SPI1);
        return rdBuf;
}
//写一个字节
void wrbyte(uint8_t Dat)                                       
{  
        spimTransferBytes(Dat, 1);
}
//读一个字节
uint8_t rdbyte(void)       
{
        return spimTransferBytes(0, 1);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

10

帖子

0

粉丝