打印
[APM32F1]

APM32F103CVT6的硬件SPI1初始化之后,还是用不了,请大佬帮忙看看

[复制链接]
1132|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
18312388731|  楼主 | 2023-5-15 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void SPI1_Configuration(void)
{
    GPIO_Config_T gpioConfig;
    SPI_Config_T spiConfig;

    /* Enable related Clock */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
        RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
        //RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
    /* config PIN_6  MISO */
    gpioConfig.pin =  GPIO_PIN_6 ;
    gpioConfig.mode = GPIO_MODE_IN_PD;//GPIO_Mode_IPD//下拉输入模式
    gpioConfig.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &gpioConfig);

    /* config PIN_5->SCK , PIN_7->MOSI */
    gpioConfig.pin = GPIO_PIN_5 | GPIO_PIN_7;
    gpioConfig.mode = GPIO_MODE_AF_PP;//GPIO_Mode_AF_PP//复用推挽输出模式
    gpioConfig.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &gpioConfig);
       
    /* config PIN_4->NSS片选 */
    gpioConfig.pin = GPIO_PIN_4;
    gpioConfig.mode = GPIO_MODE_OUT_PP;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &gpioConfig);

        GPIO_SetBit(GPIOA,GPIO_PIN_4);//拉高片选

        spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_64;//波特率
        spiConfig.crcPolynomial = 7;//CRC计算多项式       
        spiConfig.direction = SPI_DIRECTION_2LINES_FULLDUPLEX;//全双工模式
        spiConfig.firstBit = SPI_FIRSTBIT_MSB;//数据传输从MSB开始
        spiConfig.length = SPI_DATA_LENGTH_8B;//8字节数据通信
        spiConfig.mode = SPI_MODE_MASTER;//配置为主机模式
        spiConfig.nss = SPI_NSS_SOFT;//软件控制NSS(CSN)位
        spiConfig.phase = SPI_CLKPHA_1EDGE;//时钟奇数边沿采样       
        spiConfig.polarity = SPI_CLKPOL_LOW;//时钟空闲时为低电平
    SPI_ConfigStructInit(&spiConfig);
       
    /* SPI config */
    SPI_Config(SPI1, &spiConfig);

    SPI_ConfigDataSize(SPI1, SPI_DATA_LENGTH_8B);

    SPI_Enable(SPI1);
}

unsigned char SPI1_ReadWriteByte(unsigned char TxData)
{
        unsigned char RxData;
        uint32_t SPITimeout = 0x1000;
       
        while (SPI_I2S_ReadStatusFlag(SPI1, SPI_FLAG_TXBE) == RESET)                        //检测发送缓存区是否为空
        {

                if((SPITimeout--) == 0)
                        return 0;
        }
        SPI1->DATA = TxData;

       
        while (SPI_I2S_ReadStatusFlag(SPI1, SPI_FLAG_RXBNE) == RESET)                //检测接收缓存区是否为空
        {

                if((SPITimeout--) == 0) return 0;
        }

        RxData = SPI1->DATA;
       
        return RxData;
}

使用特权

评论回复
沙发
tpgf| | 2023-6-6 11:56 | 只看该作者
SPI用不了的具体现象是什么呢  楼主说明一下

使用特权

评论回复
板凳
jkl21| | 2023-6-6 12:14 | 只看该作者
正确接线并且与SPI模块正确连接。

使用特权

评论回复
地板
ccook11| | 2023-6-6 12:26 | 只看该作者
SPI模式是否符合要求,包括SPI主从模式、数据位宽、传输速率、极性和相位等参数设置。

使用特权

评论回复
5
wengh2016| | 2023-6-6 12:32 | 只看该作者
用示波器看一下,首先确定问题是发送错误,还是接收错误。

使用特权

评论回复
6
nawu| | 2023-6-6 13:10 | 只看该作者
看代码 楼主是不是使用的四线制的spi通讯方式啊

使用特权

评论回复
7
maqianqu| | 2023-6-6 13:22 | 只看该作者
可能是复位管脚被强制拉高或者拉低了。

使用特权

评论回复
8
lzmm| | 2023-6-6 13:49 | 只看该作者
请检查SPI发送和接收缓冲区是否分配和初始化正确,以及读写指针是否指向正确的位置。

使用特权

评论回复
9
aoyi| | 2023-6-6 13:52 | 只看该作者
这个设备是主设备还是从设备啊?能正常发送数据吗

使用特权

评论回复
10
zljiu| | 2023-6-6 14:11 | 只看该作者
是什么现象 是不能正常发送数据还是不能接收数据呢

使用特权

评论回复
11
rosemoore| | 2023-6-6 14:21 | 只看该作者
如果使用了SPI中断或DMA功能,请检查中断和DMA的配置是否正确,并确保中断和DMA服务程序正常运行。

使用特权

评论回复
12
gwsan| | 2023-6-6 14:24 | 只看该作者
如果在程序中能发送数据 就用示波器看看波形是不是正确的

使用特权

评论回复
13
jackcat| | 2023-6-6 14:34 | 只看该作者
这个看出来是什么原因的              

使用特权

评论回复
14
lihuami| | 2023-6-6 14:43 | 只看该作者
检查SPI引脚连接是否正确,包括SCK、MOSI、MISO等信号线和片选CS线等控制线。

使用特权

评论回复
15
tfqi| | 2023-6-6 14:45 | 只看该作者
另外 如果可以正常发送数据的话 还是要看看接收方能不能进入接收中断

使用特权

评论回复
16
deliahouse887| | 2023-6-6 15:11 | 只看该作者
最简单的就是用逻辑分析仪抓取信号了

使用特权

评论回复
17
uptown| | 2023-6-6 17:04 | 只看该作者
使用示波器测量是信号吧              

使用特权

评论回复
18
rosemoore| | 2023-6-6 17:16 | 只看该作者
检查SPI时钟源是否配置正确,时钟频率是否符合要求,并确保SPI时钟是使能的。

使用特权

评论回复
19
1988020566| | 2023-6-6 17:28 | 只看该作者
可以参考相关的开发文档或联系官方技术支持

使用特权

评论回复
20
febgxu| | 2023-6-6 17:37 | 只看该作者
硬件SPI的工作较为复杂,需要仔细地配置寄存器和相关参数

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝