久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2942|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频欧美 | 国产精品久久久久久久久久 | 欧美日韩综合一区 | 久久国产福利 | 在线看成人av | 亚洲毛片在线观看 | 日韩欧美三级电影 | 国产激情精品 | 国产精品99久久久久 | 久久小视频 | 欧美日韩成人影院 | 欧美一区二区三区大片 | 亚洲v区 | 龙珠z国语版在线观看 | 亚洲综合色视频在线观看 | 亚洲欧美中文日韩在线v日本 | 亚洲精品久久区二区三区蜜桃臀 | 日韩中文字幕 | 成人自拍视频网站 | 91视频免费观看 | 久久99精品国产自在现线小黄鸭 | 欧美久久一区二区 | 国产精品久久久久无码av | 久久亚洲精品久久国产一区二区 | 久操亚洲 | 超碰在线播 | 黄色大片免费网站 | 亚洲一区精品在线 | 91精品久久久久久久久中文字幕 | 午夜成人免费视频 | 香蕉二区| 一区二区三区电影在线观看 | 国产成人一区二区 | 一级片在线视频 | 亚洲成年人免费网站 | 涩涩视频网 | 一区二区三区在线播放 | 欧美在线观看一区 | 久久精品男人的天堂 | 欧美小视频在线观看 | 51ⅴ精品国产91久久久久久 |