標(biāo)題:
單片機(jī)軟件SPI的問題
[打印本頁]
作者:
gongzhu
時間:
2024-7-27 21:02
標(biāo)題:
單片機(jī)軟件SPI的問題
SPI也就4種模式,csdn扒了個SPI的驅(qū)動,改了下在STC15單片機(jī)下不能正常使用,讀取全是0xFF。目前用到的案例是
CPOL不限,CPHA =1。也就是1/3模式,
以下是代碼:
spi.h:
#ifndef __SPI_H
#define __SPI_H
#define FOSC 22118400UL
#define BAUD 115200
#include "STC15W4K.H"
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define CS_L P16=0
#define CS_H P16=1
#define SCK_L P15=0
#define SCK_H P15=1
#define MOSI_L P13=0
#define MOSI_H P13=1
#define MISO P44
u8 SOFT_SPI_RW_MODE(u8 write_dat);
u8 SPI2_ReadWriteByte(u8 TxData);
#endif
復(fù)制代碼
spi.c:
#include "spi.h"
#define SPI_Mode 3 //選擇SPI的模式
//CPOL:規(guī)定了SCK時鐘信號空閑狀態(tài)的電平(0-低電平,1-高電平)
//CPHA:規(guī)定了數(shù)據(jù)是在SCK時鐘的上升沿還是下降沿被采樣(0-第一個時鐘邊沿開始采樣,1-第二個時鐘邊沿開始采樣)
//模式0:CPOL=0,CPHA =0 SCK空閑為低電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))
//模式1:CPOL=0,CPHA =1 SCK空閑為低電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
//模式2:CPOL=1,CPHA =0 SCK空閑為高電平,數(shù)據(jù)在SCK的下降沿被采樣(提取數(shù)據(jù))
//模式3:CPOL=1,CPHA =1 SCK空閑為高電平,數(shù)據(jù)在SCK的上升沿被采樣(提取數(shù)據(jù))
/*spi延時函數(shù),微秒*/
static void spi_delay(u16 time)
{
u8 i = 0;
while(time--)
{
i = 10;
while(i--) ;
}
}
#if SPI_Mode==0
/* CPOL = 0, CPHA = 0 */
u8 SOFT_SPI_RW_MODE(u8 write_dat)
{
u8 i, read_dat = 0;
SCK_L;
for(i = 0; i < 8; i++)
{
if(write_dat & 0x80)
MOSI_H;
else
MOSI_L;
write_dat <<= 1;
spi_delay(1);
SCK_H;
read_dat <<= 1;
if(MISO)
read_dat++;
spi_delay(1);
SCK_L;
_nop_();
}
return read_dat;
}
#elif SPI_Mode==1
/* CPOL=0,CPHA=1 */
u8 SOFT_SPI_RW_MODE(u8 write_dat)
{
u8 i, read_dat = 0;
SCK_L;
for(i = 0; i < 8; i++)
{
SCK_H;
if(write_dat & 0x80)
MOSI_H;
else
MOSI_L;
write_dat <<= 1;
spi_delay(1);
SCK_L;
read_dat <<= 1;
if(MISO)
read_dat++;
spi_delay(1);
}
return read_dat;
}
#elif SPI_Mode==2
/* CPOL=1,CPHA=0 */
u8 SOFT_SPI_RW_MODE(u8 write_dat)
{
u8 i, read_dat = 0;
SCK_H;
for(i = 0; i < 8; i++)
{
if(write_dat & 0x80)
MOSI_H;
else
MOSI_L;
write_dat <<= 1;
spi_delay(1);
SCK_L;
read_dat <<= 1;
if(MISO)
read_dat++;
spi_delay(1);
SCK_H;
}
return read_dat;
}
#elif SPI_Mode==3
/* CPOL = 1, CPHA = 1 */
u8 SOFT_SPI_RW_MODE(u8 write_dat)
{
u8 i, read_dat = 0;
SCK_H;
for(i = 0; i < 8; i++)
{
SCK_L;
if(write_dat & 0x80)
MOSI_H;
else
MOSI_L;
write_dat <<= 1;
spi_delay(1);
SCK_H;
read_dat <<= 1;
if(MISO)
read_dat++;
spi_delay(1);
_nop_();
}
return read_dat;
}
#endif
//SPI2 讀寫一個字節(jié)
//TxData:要寫入的字節(jié)
//返回值:讀取到的字節(jié)
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
CS_L;
Rxdata = SOFT_SPI_RW_MODE(TxData);
CS_H;
return Rxdata;
}
復(fù)制代碼
作者:
npn
時間:
2024-7-28 08:36
SPI信號有問題的可以用邏輯分析儀檢測,寄存器中斷配置方法具體見數(shù)據(jù)手冊。
作者:
gqzjl
時間:
2024-7-28 08:42
e,把SPI從器件和電路圖貼出來看看吧
作者:
gqzjl
時間:
2024-7-28 08:43
可以先用邏輯分析儀抓下SCLK和MISO的信號
作者:
gqzjl
時間:
2024-7-28 09:00
還有,要先設(shè)置IO口工作模式
2.jpg
(190.93 KB, 下載次數(shù): 11)
下載附件
2024-7-28 08:57 上傳
#define CS_L P16=0
#define CS_H P16=1
#define SCK_L P15=0
#define SCK_H P15=1
#define MOSI_L P13=0
#define MOSI_H P13=1
#define MISO P44
復(fù)制代碼
有沒有可能CS沒被拉低
加上這個試試
P0M0=0x00;
P1M0=0x00;
P2M0=0x00;
P3M0=0x00;
P4M0=0x00;
P0M1=0x00;
P1M1=0x00;
P2M1=0x00;
P3M1=0x00;
P4M1=0x00;
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1