OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6690|回复: 3

STM32F103的SPI3连接CH376S的问题

[复制链接]

46

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2014-12-26
在线时间
117 小时
发表于 2021-9-29 17:13:10 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 xiong2088 于 2021-9-29 17:15 编辑

我用STM32F103ZE的SPI3连接CH376,怎么弄都初始化不了CH376,请高手指点。

void SPI3_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
          SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOG, ENABLE );
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI3,  ENABLE );
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);              //把和JTAG复用的管脚变成IO
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

         GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);  //PB3/4/5éÏà-
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;              //PG11--复位
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;           
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);  

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                         //PG9--中断   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);  
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;                 //PG15--片选  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);               
        
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;               
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;               
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;               
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        
        SPI_InitStructure.SPI_CRCPolynomial = 7;        
        SPI_Init(SPI3, &SPI_InitStructure);

        SPI_Cmd(SPI3, ENABLE);
        
        SPI3_ReadWriteByte(0xff);
        
        CH376T_CS_HIGH;           //片选拉高
        CH376T_RST_LOW;           //复位拉低    (复位高电平有效)
}


u8 SPI3_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                         
        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)
        {
                retry++;
                if(retry>200)return 0;
        }                          
        SPI_I2S_SendData(SPI3, TxData);
        
        retry=0;
        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)
        {
                retry++;
                if(retry>200)return 0;
        }                                                              
        return SPI_I2S_ReceiveData(SPI3);                                    
}


主函数里初始化SPI3后,调用下面的函数初始化:


u8        mInitCH376Host( void )  /* 初始化CH376 */
{
        u8        res;
        
        CH376_PORT_INIT( );  /* 拉高片选 */
        
        xWriteCH376Cmd( CMD11_CHECK_EXIST );  /* 测试单片机与376之间的通讯接口 */
        xWriteCH376Data( 0xaa );
        
        res = xReadCH376Data( );
        CH376T_CS_HIGH;
//        printf("ss:%02x\r\n",res);
        
        xWriteCH376Cmd( CMD11_CHECK_EXIST );  /*测试单片机与376之间的通讯接口 */
        xWriteCH376Data( 0x55 );
        
        res = xReadCH376Data( );
        CH376T_CS_HIGH;
//        printf("ss:%02x\r\n",res);        
        
        xWriteCH376Cmd( CMD11_CHECK_EXIST );  /* 测试单片机与376之间的通讯接口 */
        xWriteCH376Data( 0x65 );
        CH376T_CS_HIGH;
        res = xReadCH376Data( );
        xEndCH376Cmd( );
        if ( res != 0x9A ) return( ERR_USB_UNKNOWN );

        
        CH376_PORT_INIT( );
        xWriteCH376Cmd( CMD11_SET_USB_MODE );  /*设定USB模式 */
        xWriteCH376Data( 0x05 );
        delay_us( 20 );
        res = xReadCH376Data( );
        xEndCH376Cmd( );
        
        if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );
        else
        {
                return( ERR_USB_UNKNOWN );  /*初始化失败 */
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

889

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1468
金钱
1468
注册时间
2020-8-19
在线时间
333 小时
发表于 2021-9-29 17:31:44 | 显示全部楼层
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-4-10
在线时间
4 小时
发表于 2021-9-30 17:15:11 | 显示全部楼层
检查下初始化最后是否需要进行一次读写,也就是SPI3_ReadWriteByte(0xff);是否需要;我这边同事调试SPI时,加了这一句导致读取和写入都有问题。
回复

使用道具 举报

0

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2018-3-20
在线时间
74 小时
发表于 2023-4-22 10:09:10 | 显示全部楼层
帮顶            
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表