久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
C51單片機使用硬件SPI通訊W25Q16 flash芯片,MISO無信號
[打印本頁]
作者:
公子陸
時間:
2025-6-17 17:10
標題:
C51單片機使用硬件SPI通訊W25Q16 flash芯片,MISO無信號
如圖,SPI通訊主機正常發送信號,但從機一直保持低電平。初始化的時候我把SPI的口都設置為推挽輸出高電平狀態,空閑時MISO也應該是高,但不知道什么原因拉低了。求助,幫忙分析一下代碼。多謝!!
#include "H/Function_Init.H"
#define SPI_CS P07 // 自定義片選引腳
// W25Q16指令集
#define W25Q16_Write_Status 0x01 //W25Q16寫狀態寄存器指令
#define W25Q16_Read_Status 0x05 //W25Q16讀狀態寄存器指令
#define W25Q16_Write_Enable 0x06 //寫使能指令
#define W25Q16_Page_Program 0x02 //頁編程指令
#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發送數據數目
uint8_t RxXferCount = 0; //SPI/TWI接受數據數目
bit SPI0Flag = 0;
void Delay(unsigned long int delaycnt)
{
while(delaycnt--);
}
/*****************************************************
*函數名稱:void SPI0_Init(void)
*函數功能:SPI0初始化
*入口參數:void
*出口參數:void
*****************************************************/
void SPI0_Init(void)
{
OTCON |= 0X10; //設置SPI0工作模式
US0CON0 = 0x23; //-設置SPI0為主設備,SCK空閑時間為低電平,SCK周期第一沿采集數據,時鐘速率為Fsy/8,模式0
US0CON1 = 0x00; //MSB優先發送,8位傳輸,bit0:TXE=0不允許發送中斷,TXE=1允許中斷
US0CON0 |= 0x80; //開啟SPI0
IE1 |= 0x01;
EA = 1;
}
/*****************************************************
*函數名稱:void TWI0/PI/UART1_Int() interrupt 7
*函數功能:USCI0中斷函數
*入口參數:void
*出口參數:void
*****************************************************/
void SPI0_Int(void) interrupt 7 //SPI0中斷函數
{
if(US0CON1 & 0X08) //發送緩存器空標志判斷
{
US0CON1 &= ~0X08;
}
if(US0CON1 & 0X80) //數據傳輸完成標志位判斷
{
US0CON1 &= ~0X80;
SPI0Flag = 1;
}
}
//SPI口讀寫數據
unsigned char SPI0_WriteReadByte(unsigned char TxData)
{
unsigned char RxData = 0;
US0CON2 = TxData;
// while(SPI0Flag == 0); //等待發送完成
while(!(SPI0Flag == 1));
SPI0Flag = 0;
RxData = US0CON2;
return RxData ;
// return US0CON2;
}
//讀取W25QXX的狀態寄存器
unsigned char W25Q16_ReadStatus(void)
{
unsigned char W25Q16_statusbyte=0;
SPI_CS=0; //使能器件
SPI0_WriteReadByte(W25Q16_Read_Status); //發送讀取狀態寄存器命令
W25Q16_statusbyte=SPI0_WriteReadByte(0xff); //讀取一個字節
SPI_CS=1; //取消片選
return W25Q16_statusbyte;
}
//等待空閑
void W25Q16_Wait_Busy(void)
{ SPI_CS = 0;
while(W25Q16_ReadStatus()&0x01); // 等待BUSY位清空
SPI_CS = 1;
}
// W25Q16寫使能,將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); //發送片擦除命令
SPI_CS=1; //取消片選
W25Q16_Wait_Busy(); //等待芯片擦除結束
}
// 頁寫入數據
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(); // 發送寫使能
SPI_CS = 0;
SPI0_WriteReadByte(W25Q16_Page_Program); // 發送頁編程指令
SPI0_WriteReadByte((addr >> 16) ); // 地址高位
SPI0_WriteReadByte((addr >> 8) );
SPI0_WriteReadByte(addr);
// 寫入數據
for (i = 0; i < len; i++)
{
SPI0_WriteReadByte(buf[i]);
}
SPI_CS = 1;
// while (W25Q16_ReadStatus() & 0x01); // 等待寫入完成
W25Q16_Wait_Busy(); //等待寫入結束
}
// 從W25Q16讀取數據
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 );
// 讀取數據
for (i = 0; i < len; i++)
{
buf[i] = SPI0_WriteReadByte(0xFF);
}
SPI_CS = 1;
}
//讀取芯片ID
//0XEF14,表示芯片型號為W25Q16
unsigned long W25Q16_ReadID(void)
{
unsigned long Temp = 0;
SPI_CS=0;
SPI0_WriteReadByte(0x90);//發送讀取ID命令
SPI0_WriteReadByte(0x00);
SPI0_WriteReadByte(0x00);
SPI0_WriteReadByte(0x00);
Temp|=SPI0_WriteReadByte(0xFF)<<8;
Temp|=SPI0_WriteReadByte(0xFF);
SPI_CS=1;
return Temp;
}
/*****************************************************
*函數名稱:void main(void)
*函數功能:USCI0測試
*入口參數:void
*出口參數: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();//讀狀態位
// 讀取Flash ID
W25Q16_ReadID();
for(j=0;j<3;j++)
{
SPI_CS = 0;
W25Q16_WriteData(W25Q16_addr, SPI0_Master_SendData[j], 8); // 直接寫入一行
W25Q16_ReadData(W25Q16_addr, &readBuf[j], 8); // 讀取到獨立緩沖區
SPI_CS = 1;
W25Q16_addr += 0x000100; // 遞增地址
}
Delay(5000);
P01 = ~P01;
}
}
復制代碼
作者:
cocolala
時間:
2025-6-23 10:41
建議你先不要使用硬件SPI調試,可以先使用模擬SPI調試。
模擬SPI速度慢,牽扯的寄存器比較少,避免是對單片機SPI外設使用不慎導致調不通。
程序截圖1.jpg
(247.37 KB, 下載次數: 0)
下載附件
2025-6-23 10:40 上傳
程序截圖2.jpg
(326.93 KB, 下載次數: 0)
下載附件
2025-6-23 10:40 上傳
附件是艾克姆科技的例程源碼和PDF說明,這個說明是我目前看到的講解最詳細的一個了。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美精品一区二区三区在线
|
国产色婷婷久久99精品91
|
手机在线不卡av
|
草久在线视频
|
日本精品一区二区三区在线观看
|
免费一级黄
|
国产精彩视频
|
国产欧美一区二区三区免费
|
国产精品久久久久久久7电影
|
欧美久久久
|
美女视频网站久久
|
免费福利视频一区二区三区
|
精品国产一区一区二区三亚瑟
|
中文在线视频
|
中文字幕免费
|
免费的黄色片子
|
天天干夜夜操
|
91性高湖久久久久久久久_久久99
|
黄色成人在线网站
|
激情视频网站
|
中文在线一区
|
成人免费看黄
|
中文字幕在线视频一区二区三区
|
毛片一级电影
|
欧美理伦片在线播放
|
夜夜精品视频
|
久久精品一区
|
狠狠爱视频
|
亚洲欧美综合精品另类天天更新
|
国产精品久久久久久久久久久久冷
|
欧美在线综合
|
欧美久久久久久久
|
自拍视频网站
|
日日夜夜天天
|
午夜一区
|
一区二区成人在线
|
久久久久久久久久久久久久av
|
青青草这里只有精品
|
午夜精品一区二区三区在线视
|
欧美国产视频
|
国产免费一级一级
|