軟體模擬SPI
以STC15W408AS單片機為例
一、硬體接線
STC15系列單片機SPI使用教程(一)
二、程式撰寫
1、相關宏定義和引腳定義
//資料型別重定義
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//IO埠定義
sbit MISO = P2^2; //主機讀從設備(主入從出)
sbit MOSI = P2^3; //主機寫從設備(主出從入)
sbit SCK = P2^1; //時鐘信號
sbit CE = P2^5;
sbit CS = P2^4; //片選信號(控制芯片是否被選中)
sbit IRQ = P3^2; //INT0
2、SPI資料交換代碼
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr = 0; bit_ctr < 8; bit_ctr++){
MOSI = (byte & 0x80); //獲得byte的最高位資料
byte = (byte << 1); //移動下一位到MSB
SCK = 1; //設定SCK為高
byte |= MISO; //從MISO獲得的一位資料
SCK = 0; //設定SCK為低
}
return byte; //最后回傳從MISO讀出的資料
}
3、NRF24L01讀寫例程
//NRF24L01相關宏定義
#define NOP 0xFF //空操作
#define READ_REG 0x00
#define WRITE_REG 0x20
#define TX_ADDR 0x10
//SPI寫暫存器
//reg:指定暫存器地址
//value:寫入的值
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CS = 0; // 使能SPI傳輸
status = SPI_RW(reg); //回傳從MISO讀出的資料,status應為上次向該暫存器內寫的value
SPI_RW(value); //寫入暫存器的值
CS = 1; // 禁止SPI傳輸
return status; // 回傳狀態值
}
//讀取SPI暫存器值
//reg:要讀的暫存器
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CS = 0; // 使能SPI傳輸
SPI_RW(reg); // 發送暫存器號
reg_val = SPI_RW(NOP); // 讀取暫存器內容
CS = 1; // 禁止SPI傳輸
return reg_val; // 回傳狀態值
}
//在指定位置寫指定長度的資料
//reg:暫存器(位置)
//*pBuf:資料指標
//bytes:資料長度
//回傳值,此次讀到的狀態暫存器值
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CS = 0; // 使能SPI傳輸
status = SPI_RW(reg);// 發送暫存器值(位置),并讀取狀態值
for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++){ // 寫入資料
SPI_RW(*pBuf++);
}
CS = 1;//關閉SPI傳輸
return status; // 回傳讀到的狀態值
}
//在指定位置讀出指定長度的資料
//reg:暫存器(位置)
//*pBuf:資料指標
//bytes:資料長度
//回傳值,此次讀到的狀態暫存器值
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
uchar status,byte_ctr;
CS = 0; // 使能SPI傳輸
status = SPI_RW(reg); // 發送暫存器值(位置),并讀取狀態值
for(byte_ctr = 0; byte_ctr < bytes; byte_ctr++){
pBuf[byte_ctr] = SPI_RW(NOP); // 讀出資料
}
CS = 1; // 關閉SPI傳輸
return status; // 回傳讀到的狀態值
}
//檢測24L01是否存在
//回傳值:0,成功;1,失敗
uchar NRF24L01_Check(void)
{
uchar buf[5]={0xA5, 0xA5, 0xA5, 0xA5, 0xA5};
uchar buf1[5];
uchar i;
CE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, buf, 5);
SPI_Read_Buf(TX_ADDR, buf1, 5); //讀出寫入的地址
CE = 1;
for(i = 0; i < 5; i++)
if(buf1[i] != 0xA5)
break;
if(i!=5)
return 1;//檢測24L01錯誤
return 0; //檢測到24L01
}
//主函式
void main(void)
{
Init_Uart();
EA = 1; //開總中斷
NRF24L01_Check(); //切換SPI后需要讀多幾次,等待SPI穩定
NRF24L01_Check();
if(!NRF24L01_Check()){
SendString("NRF24L01 Checked OK!\r\n");
}
else{
SendString("NRF24L01 Checked Fail!\r\n");
}
while(1);
}
4、串口代碼
STC15系列單片機SPI使用教程(一)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157049.html
標籤:python
上一篇:CorelDRAW哪個版本好用實用強x4/X8/2019/2020/2021
下一篇:合并HEX檔案
