相關SPI初始化這一部分。燒寫程式后,PC設備管理中識別不到。
【現象:會有一個顯示“未知USB設備(設備描述符請求失敗)”。但緊接著1秒后會自動重繪然后此設備顯示消失】
除錯很多次都不對。SPI初始化就那幾種,但改來改去依然不對。
望大神指教。
代碼如下:
/* CH374芯片 軟體模擬SPI串行連接的硬體抽象層 V1.0 */
/* 提供I/O介面子程式,提供暫存器級讀寫子程式 */
#include "HAL.H"
#include "..\includes.h"
#include "CH374INC.H"
?
#define SCS0 PORTB &= ~(1 << PB0)
//片選信號置低
#define SCS1 PORTB |= (1 << PB0)
// 片選信號置高
#define SCK0 PORTB &= ~(1 << PB1)
#define SCK1 PORTB |= (1 << PB1)
#define MOSI0 PORTB &= ~(1 << PB2)
#define MOSI1 PORTB |= (1 << PB2)
#define MISO0 PORTB &= ~(1 << PB3)
#define MISO1 PORTB |= (1 << PB3)
#define INT00 PORTD &= ~(1 << PD0)
#define INT01 PORTD |= (1 << PD0)
#define _BV(N) (1 << (N))
#define SetBit(PORT,N) PORT|= _BV(N)
#define ClrBit(PORT,N) PORT&=~_BV(N)
#define GetBit(PIN,N) (PIN>>N)&(0x01)
/**********************************************
需根據單片機實際管腳定義
***********************************************/
#define SPI_PORT_1 PORTB
#define SPI_DDR_1 DDRB
#define SPI_PIN_1 PINB
#define MOSI 2
#define SCK 1
#define SS 0
#define MISO 3
#define SPI_M_PORT1_CONFIG
{SetBit(SPI_DDR_1,MOSI);SetBit(SPI_DDR_1,SCK);SetBit(SPI_DDR_1,SS);ClrBit(SPI_DDR_1,MISO);}
#define SPI_S_PORT1_CONFIG {ClrBit(SPI_DDR_1,MOSI);ClrBit(SPI_DDR_1,SCK);ClrBit(SPI_DDR_1,SS);SetBit(SPI_DDR_1,MISO);}
void SPI_PORT_INIT(void) //IO口初始化
{
SetBit(SPI_PORT_1,MOSI);
SetBit(SPI_PORT_1,MISO);
SetBit(SPI_PORT_1,SCK);
SetBit(SPI_PORT_1,SS);
}
void SPI_MasterInit(void)
{
SPI_M_PORT1_CONFIG;
SPCR = 0x52; //使能SPI 主機模式,設定時鐘速率為fck/64
SPSR = 0x00; //tup SPI
}
void CH374_PORT_INIT(void) /* 由于使用通用I/O模擬并口讀寫時序,所以進行初始化 */
{
SPI_PORT_INIT();
SPI_MasterInit();
}
void Spi374OutByte( UINT8 d ) /* SPI輸出8個位資料 */
{ /* 如果是硬體SPI介面,應該是先將資料寫入SPI資料暫存器,然后查詢SPI狀態暫存器以等待SPI位元組傳輸完成 */
UINT8 i;
for ( i = 0; i < 8; i ++ ) {
SCK0;//CH374_SPI_SCK = 0;
if ( d & 0x80 )
MOSI1;//PORTB |= (1<<2);//CH374_SPI_SDI = 1;
else
MOSI0;//CH374_SPI_SDI = 0;
d <<= 1; /* 資料位是高位在前 */
SCK1;//CH374_SPI_SCK = 1; /* CH374在時鐘上升沿采樣輸入 */
}
}
UINT8 Spi374InByte( void ) /* SPI輸入8個位資料 */
{ /* 如果是硬體SPI介面,應該是先查詢SPI狀態暫存器以等待SPI位元組傳輸完成,然后從SPI資料暫存器讀出資料 */
UINT8 i, d;
d = 0;
/* 如果SPI的SDO和SDI合用一個I/O引腳,那么必須在此設定該I/O方向為輸入 */
for ( i = 0; i < 8; i ++ ) {
SCK0;//CH374_SPI_SCK = 0; /* CH374在時鐘下降沿輸出 */
d <<= 1; /* 資料位是高位在前 */
if(MISO1) d++; //if ( CH374_SPI_SDO ) d ++;
SCK1;//CH374_SPI_SCK = 1;
}
return( d );
}
void Spi374Start( UINT8 addr, UINT8 cmd ) /* SPI開始 */
{
// CH374_SPI_SCS = 1;
/* 對于雙向I/O引腳模擬SPI介面,那么必須確保已經設定SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */
SCS0;//CH374_SPI_SCS = 0; /* SPI片選有效 */
Spi374OutByte( addr );
Spi374OutByte( cmd );
}
#define Spi374Stop( ) {SCS1;}
//{ CH374_SPI_SCS = 1; } /* SPI結束 */
//void Spi374Stop( void ) /* SPI結束 */
//{
// CH374_SPI_SCS = 1; /* SPI片選無效 */
//}
UINT8 Read374Byte( UINT8 mAddr ) /* 從指定暫存器讀取資料 */
{
UINT8 d;
Spi374Start( mAddr, CMD_SPI_374READ );
d = Spi374InByte( );
Spi374Stop( );
return( d );
}
void Write374Byte( UINT8 mAddr, UINT8 mData ) /* 向指定暫存器寫入資料 */
{
Spi374Start( mAddr, CMD_SPI_374WRITE );
Spi374OutByte( mData );
Spi374Stop( );
}
void Read374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 從指定起始地址讀出資料塊 */
{
Spi374Start( mAddr, CMD_SPI_374READ );
while ( mLen -- ) *mBuf++ = Spi374InByte( );
Spi374Stop( );
}
void Write374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 向指定起始地址寫入資料塊 */
{
Spi374Start( mAddr, CMD_SPI_374WRITE );
while ( mLen -- ) Spi374OutByte( *mBuf++ );
Spi374Stop( );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/109904.html
標籤:單片機/工控
上一篇:求教大神!
