|
如圖,SPI通訊主機(jī)正常發(fā)送信號(hào),但從機(jī)一直保持低電平。初始化的時(shí)候我把SPI的口都設(shè)置為推挽輸出高電平狀態(tài),空閑時(shí)MISO也應(yīng)該是高,但不知道什么原因拉低了。求助,幫忙分析一下代碼。多謝。
- #include "H/Function_Init.H"
- #define SPI_CS P07 // 自定義片選引腳
- // W25Q16指令集
- #define W25Q16_Write_Status 0x01 //W25Q16寫(xiě)狀態(tài)寄存器指令
- #define W25Q16_Read_Status 0x05 //W25Q16讀狀態(tài)寄存器指令
- #define W25Q16_Write_Enable 0x06 //寫(xiě)使能指令
- #define W25Q16_Page_Program 0x02 //頁(yè)編程指令
- #define W25Q16_Read_Data 0x03 //讀使能指令
- #define W25Q16_SectorErase 0x20 //快B刪除指令
- #define W25Q16_Chip_Erase 0xc7 //擦除W25Q16芯片
- #define W25Q16_Device_ID 0x90 //讀芯片ID
- uint8_t SPI0_Master_SendData[3][8] = {
- {0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8},
- {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18},
- {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00,0x00}
- };
- volatile uint8_t SPI0_Slaver_ReceiveData[8];
- uint8_t TxXferCount = 0; //SPI/TWI發(fā)送數(shù)據(jù)數(shù)目
- uint8_t RxXferCount = 0; //SPI/TWI接受數(shù)據(jù)數(shù)目
- bit SPI0Flag = 0;
- void Delay(unsigned long int delaycnt)
- {
- while(delaycnt--);
- }
- /*****************************************************
- *函數(shù)名稱:void SPI0_Init(void)
- *函數(shù)功能:SPI0初始化
- *入口參數(shù):void
- *出口參數(shù):void
- *****************************************************/
- void SPI0_Init(void)
- {
- OTCON |= 0X10; //設(shè)置SPI0工作模式
- US0CON0 = 0x23; //-設(shè)置SPI0為主設(shè)備,SCK空閑時(shí)間為低電平,SCK周期第一沿采集數(shù)據(jù),時(shí)鐘速率為Fsy/8,模式0
- US0CON1 = 0x00; //MSB優(yōu)先發(fā)送,8位傳輸,bit0:TXE=0不允許發(fā)送中斷,TXE=1允許中斷
- US0CON0 |= 0x80; //開(kāi)啟SPI0
- IE1 |= 0x01;
- EA = 1;
- }
- /*****************************************************
- *函數(shù)名稱:void TWI0/PI/UART1_Int() interrupt 7
- *函數(shù)功能:USCI0中斷函數(shù)
- *入口參數(shù):void
- *出口參數(shù):void
- *****************************************************/
- void SPI0_Int(void) interrupt 7 //SPI0中斷函數(shù)
- {
- if(US0CON1 & 0X08) //發(fā)送緩存器空標(biāo)志判斷
- {
- US0CON1 &= ~0X08;
- }
- if(US0CON1 & 0X80) //數(shù)據(jù)傳輸完成標(biāo)志位判斷
- {
- US0CON1 &= ~0X80;
- SPI0Flag = 1;
- }
- }
- //SPI口讀寫(xiě)數(shù)據(jù)
- unsigned char SPI0_WriteReadByte(unsigned char TxData)
- {
- unsigned char RxData = 0;
- US0CON2 = TxData;
- // while(SPI0Flag == 0); //等待發(fā)送完成
- while(!(SPI0Flag == 1));
- SPI0Flag = 0;
- RxData = US0CON2;
- return RxData ;
- // return US0CON2;
- }
- //讀取W25QXX的狀態(tài)寄存器
- unsigned char W25Q16_ReadStatus(void)
- {
- unsigned char W25Q16_statusbyte=0;
- SPI_CS=0; //使能器件
- SPI0_WriteReadByte(W25Q16_Read_Status); //發(fā)送讀取狀態(tài)寄存器命令
- W25Q16_statusbyte=SPI0_WriteReadByte(0xff); //讀取一個(gè)字節(jié)
- SPI_CS=1; //取消片選
- return W25Q16_statusbyte;
- }
- //等待空閑
- void W25Q16_Wait_Busy(void)
- { SPI_CS = 0;
- while(W25Q16_ReadStatus()&0x01); // 等待BUSY位清空
- SPI_CS = 1;
- }
- // W25Q16寫(xiě)使能,將WEL置位
- //W25QXX_WriteEnable 0x06
- void W25Q16_WriteEnable(void)
- {
- SPI_CS = 0;
- SPI0_WriteReadByte(W25Q16_Write_Enable);
- SPI_CS = 1;
- }
- //芯片擦除
- void W25Q16_Erase_Chip(void)
- {
- // W25Q16_Wait_Busy();
- W25Q16_WriteEnable(); //SET WEL
- SPI_CS=0; //使能器件
- SPI0_WriteReadByte(W25Q16_Chip_Erase); //發(fā)送片擦除命令
- SPI_CS=1; //取消片選
- W25Q16_Wait_Busy(); //等待芯片擦除結(jié)束
- }
- // 頁(yè)寫(xiě)入數(shù)據(jù)
- void W25Q16_WriteData(unsigned long addr, unsigned char *buf, unsigned int len)
- {
- unsigned int i = 0;
- // while(W25Q16_ReadStatus()&0x01); // 判斷是否忙
- W25Q16_Wait_Busy();
- W25Q16_WriteEnable(); // 發(fā)送寫(xiě)使能
- SPI_CS = 0;
- SPI0_WriteReadByte(W25Q16_Page_Program); // 發(fā)送頁(yè)編程指令
- SPI0_WriteReadByte((addr >> 16) ); // 地址高位
- SPI0_WriteReadByte((addr >> 8) );
- SPI0_WriteReadByte(addr);
- // 寫(xiě)入數(shù)據(jù)
- for (i = 0; i < len; i++)
- {
- SPI0_WriteReadByte(buf[i]);
- }
- SPI_CS = 1;
- // while (W25Q16_ReadStatus() & 0x01); // 等待寫(xiě)入完成
- W25Q16_Wait_Busy(); //等待寫(xiě)入結(jié)束
- }
- // 從W25Q16讀取數(shù)據(jù)
- void W25Q16_ReadData(unsigned long addr, unsigned char *buf, unsigned int len)
- {
- unsigned int i = 0;
- SPI_CS = 0;
- SPI0_WriteReadByte(W25Q16_Read_Data);
- SPI0_WriteReadByte((addr >> 16) ); // 地址高位
- SPI0_WriteReadByte((addr >> 8) );
- SPI0_WriteReadByte(addr );
- // 讀取數(shù)據(jù)
- for (i = 0; i < len; i++)
- {
- buf[i] = SPI0_WriteReadByte(0xFF);
- }
- SPI_CS = 1;
- }
- //讀取芯片ID
- //0XEF14,表示芯片型號(hào)為W25Q16
- unsigned long W25Q16_ReadID(void)
- {
- unsigned long Temp = 0;
- SPI_CS=0;
- SPI0_WriteReadByte(0x90);//發(fā)送讀取ID命令
- SPI0_WriteReadByte(0x00);
- SPI0_WriteReadByte(0x00);
- SPI0_WriteReadByte(0x00);
- Temp|=SPI0_WriteReadByte(0xFF)<<8;
- Temp|=SPI0_WriteReadByte(0xFF);
- SPI_CS=1;
- return Temp;
- }
- /*****************************************************
- *函數(shù)名稱:void main(void)
- *函數(shù)功能:USCI0測(cè)試
- *入口參數(shù):void
- *出口參數(shù):void
- *****************************************************/
- void main(void)
- {
- unsigned char j=0,i=0;
- unsigned char readBuf[8];
- unsigned long W25Q16_addr = 0x000000; // 起始地址
- P0CON = 0xf2; //P07口推挽輸出,
- P0 = 0xf0; //P07初始高電平
- SPI0_Init();
-
- W25Q16_Erase_Chip();
- while(1)
- {
- // W25Q16_ReadStatus();//讀狀態(tài)位
- // 讀取Flash ID
- W25Q16_ReadID();
-
- for(j=0;j<3;j++)
- {
- SPI_CS = 0;
- W25Q16_WriteData(W25Q16_addr, SPI0_Master_SendData[j], 8); // 直接寫(xiě)入一行
- W25Q16_ReadData(W25Q16_addr, &readBuf[j], 8); // 讀取到獨(dú)立緩沖區(qū)
- SPI_CS = 1;
- W25Q16_addr += 0x000100; // 遞增地址
- }
- Delay(5000);
- P01 = ~P01;
- }
- }
復(fù)制代碼 |
|