找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2646|回复: 1
打印 上一主题 下一主题
收起左侧

SPI驱动CH376,亲测可用

[复制链接]
跳转到指定楼层
楼主
ID:73803 发表于 2018-12-15 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "CH376.h"


/*******************************************************************************
* 函  数  名      : CH376_PORT_INIT
* 描      述      : 由于使用软件模拟SPI读写时序,所以进行初始化.
*                   如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或
*                   mode0(CPOL=0&CPHA=0),CH376在时钟上升沿采样输入,下降沿输出,数
*                   据位是高位在前.
*******************************************************************************/
void CH376_PORT_INIT(void){ //CH376的SPI接口初始化
        GPIO_InitTypeDef  GPIO_InitStructure; //定义GPIO的初始化枚举结构       
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择端口号                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻      
        GPIO_Init(GPIOA,&GPIO_InitStructure);       

        GPIO_SetBits(CH376_INTPORT,CH376_INT); //中断输入脚拉高电平
        GPIO_SetBits(SPI2PORT,SPI2_NSS); //片选接口接高电平
}
/*******************************************************************************
* 函  数  名      : xEndCH376Cmd   结束命令.
*******************************************************************************/
void xEndCH376Cmd(void){ //结束命令
        GPIO_SetBits(SPI2PORT,SPI2_NSS); //SPI片选无效,结束CH376命令
}
/*******************************************************************************
SPI输出8个位数据.    * 发送: u8 d:要发送的数据.
*******************************************************************************/
void Spi376OutByte(u8 d){ //SPI发送一个字节数据
   SPI2_SendByte(d);         
}
/*******************************************************************************
* 描      述      : SPI接收8个位数据.  u8 d:接收到的数据.
*******************************************************************************/
u8 Spi376InByte(void){        //SPI接收一个字节数据
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET); //如果接受寄存器没有收到数据,循环
        return SPI_I2S_ReceiveData(SPI2);
}
/*******************************************************************************
* 描      述      : 向CH376写  命令.
* 输      入      : u8 mCmd:要发送的命令.
*******************************************************************************/
void xWriteCH376Cmd(u8 mCmd){
        GPIO_SetBits(SPI2PORT,SPI2_NSS);   /* 防止之前未通过xEndCH376Cmd禁止SPI片选 */
        delay_us(20);
/* 对于双向I/O引脚模拟SPI接口,那么必须确保已经设置SPI_SCS,SPI_SCK,SPI_SDI为输出
*  方向,SPI_SDO为输入方向 */
        GPIO_ResetBits(SPI2PORT,SPI2_NSS);     /* SPI片选有效 */
        Spi376OutByte( mCmd );  /* 发出命令码 */
        delay_us(1700);   /* 延时1.5mS确保读写周期大于1.5mS,或者用上面一行的状态查询代替 */
}
/*******************************************************************************
* 描      述      : 向CH376写   数据.
* 输      入      : u8 mData:
*                   要发送的数据.
*******************************************************************************/
void xWriteCH376Data(u8 mData){
        Spi376OutByte( mData );
        delay_us(800);  /* 确保读写周期大于0.6mS */
}
/*******************************************************************************
* 函  数  名      : xReadCH376Data
* 描      述      : 从CH376读数据.
*******************************************************************************/
u8 xReadCH376Data(void){
        u8 i;
        delay_us(10);
        i = SPI2_SendByte(0xFF);
        return(i);
}
/*******************************************************************************
* 描      述      : 查询CH376中断(INT#低电平).
* 返      回      : 0:无中断.       1:有中断.
*******************************************************************************/
u8 Query376Interrupt(void){
        u8 i;
        i = GPIO_ReadInputDataBit(CH376_INTPORT,CH376_INT);        
        return( i );
}                       
/*******************************************************************************
* 描      述      : 初始化CH376.
* 返      回      : FALSE:无中断.  TRUE:有中断.
*******************************************************************************/
u8 mInitCH376Host(void){
        u8        res;       
        delay_ms(600);
        CH376_PORT_INIT( );           /* 接口硬件初始化 */
        xWriteCH376Cmd( CMD11_CHECK_EXIST );    /* 测试单片机与CH376之间的通讯接口 */
        xWriteCH376Data( 0x55 );
        res = xReadCH376Data( );
//        printf("res =%02x \n",(unsigned short)res);
        xEndCH376Cmd( );
        if ( res != 0xAA ) return( ERR_USB_UNKNOWN );  /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */
        xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */
        xWriteCH376Data( 0x06 ); //06H=已启用的主机方式并且自动产生SOF包  ???
        delay_us(20);
        res = xReadCH376Data( );
//        printf("res =%02x \n",(unsigned short)res);
        xEndCH376Cmd( );

        if ( res == CMD_RET_SUCCESS ){  //RES=51  命令操作成功
            return( USB_INT_SUCCESS ); //USB事务或者传输操作成功
        }else{
            return( ERR_USB_UNKNOWN );/* 设置模式错误 */
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-15 15:13 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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