網(wǎng)上關于stm8s1003 驅(qū)動si4432的 驅(qū)動不是很多 ,我也是弄了大半天才可以和si4432 spi驅(qū)動成功。 接下來要做無線收發(fā)和組網(wǎng)。
暫時先貼 spi驅(qū)動的
spi模擬方式:
main.c
#include "stm8s.h"
#include "mytype.h"
#include"delay.h"
#include "USART.h"
//定義CPU內(nèi)部時鐘
#define SYS_CLOCK 16
#define SPIPort GPIOC
#define nMOSI 6
#define nMISO 7
#define nSCLK 5
#define nCS 4
#define MISO_G gbi(SPIPort->IDR,nMISO)
#define MOSI_H sbi(SPIPort->ODR,nMOSI)
#define MOSI_L cbi(SPIPort->ODR,nMOSI)
#define SCLK_H sbi(SPIPort->ODR,nSCLK)
#define SCLK_L cbi(SPIPort->ODR,nSCLK)
#define CS_H sbi(SPIPort->ODR,nCS)
#define CS_L cbi(SPIPort->ODR,nCS)
void CLOCK_Config(u8 SYS_CLK);
/**************************************************************************
* 函數(shù)名:SPI_Init
* 描述 :SPI模塊發(fā)送函數(shù)
* 輸入 :無
* 返回 :無
*************************************************************************/
void SPI_Init(void)
{
cbi(SPIPort->DDR,nMISO);//MISO INPUT
sbi(SPIPort->CR1,nMISO);
sbi(SPIPort->DDR,nMOSI);//MOSI OUTPUT
sbi(SPIPort->CR1,nMOSI);
sbi(SPIPort->DDR,nSCLK);//SCLK OUTPUT
sbi(SPIPort->CR1,nSCLK);
sbi(SPIPort->DDR,nCS);//CS OUTPUT
sbi(SPIPort->CR1,nCS);
}
/**************************************************************************
* 函數(shù)名:SPI_SendByte
* 描述 :SPI模塊發(fā)送函數(shù)
* 輸入 :發(fā)送數(shù)據(jù)
* 返回 :返回數(shù)據(jù)
*************************************************************************/
u8 SPI_SendByte(u8 byte)
{
u8 i = 0;
u8 bit_r = 0;
for(i=0;i<8;i++) // output 8-bit
{
//MOSI_PIN=byte & 0x80; //output 'byte' MSB to MOSI_PIN
if(byte & 0x80)
MOSI_H;
else
MOSI_L;
byte <<= 1; // shift next bit into MSB..
SCLK_H;
bit_r<<=1;
if(MISO_G) bit_r++;
SCLK_L;
//SCK_PIN=1 ; // Set SCK_PIN high..
//byte|=MISO_PIN; // capture current MISO_PIN bit
//SCK_PIN=0; // then set SCK_PIN low again
}
return(bit_r); // return read byte
}
/**************************************************************************
* 函數(shù)名:SPI_ReadRegister
* 描述 :SPI讀取寄存器數(shù)值
* 輸入 :寄存器地址
* 返回 :數(shù)據(jù)
*************************************************************************/
u8 SPI_ReadRegister (u8 addr)
{
u8 Result;
CS_L; //nSEL = 0;
SPI_SendByte(addr); //write data into the SPI register
Result = SPI_SendByte(0xFF);
CS_H; //nSEL = 1;
return(Result);
}
/**************************************************************************
* 函數(shù)名:SPI_WriteRegister
* 描述 :SPI寫寄存器數(shù)值
* 輸入 :寄存器地址,數(shù)值
* 返回 :無
*************************************************************************/
void SPI_WriteRegister (u8 addr, u8 value)
{
CS_L; //nSEL = 1;
SPI_SendByte(addr|0x80); //write data into the SPI register
SPI_SendByte(value);
CS_H; //nSEL = 1;
}
/**************************************************************************
* 函數(shù)名:main
* 描述 :主函數(shù)
* 輸入 :無
* 返回 :無
*************************************************************************/
int main(void)
{
u8 temp = 0;
CLOCK_Config(SYS_CLOCK);//系統(tǒng)時鐘初始化
UART_Init(SYS_CLOCK,9600);
SPI_Init();
while(1)
{
temp = SPI_ReadRegister(0x00);
delay_ms(100);
UART_SendChar(temp);
temp = SPI_ReadRegister(0x09);
delay_ms(100);
UART_SendChar(temp);
}
}
/**************************************************************************
* 函數(shù)名:CLOCK_Config
* 描述 :系統(tǒng)內(nèi)部時鐘配置 SYS_CLK : 2、4、8、16 系統(tǒng)啟動默認內(nèi)部2MHZ
* 輸入 :無
* 返回 :無
*************************************************************************/
void CLOCK_Config(u8 SYS_CLK)
{
//時鐘配置為內(nèi)部RC,16M
CLK->CKDIVR &=~(BIT(4)|BIT(3));
switch(SYS_CLK)
{
case 2: CLK->CKDIVR |=((1<<4)|(1<<3)); break;
case 4: CLK->CKDIVR |=(1<<4); break;
case 8: CLK->CKDIVR |=(1<<3); break;
}
}
#include "mytype.h"
[cpp] view plain copy
#ifndef __MyType_H
#define __MyType_H
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
/* io configs */
#ifndef sbi
#define sbi(io,bit) ( io |= (1< //example:sbi(GPIOA->ODR,0);sbi(GPIOA->DDR,0); #endif #ifndef cbi #define cbi(io,bit) ( io &= ~(1< //example:cbi(GPIOA->ODR,0);cbi(GPIOA->DDR,0); #endif #ifndef xor #define xor(port, bit) (port) ^= (1 << (bit)) #endif #ifndef gbi #define gbi(pin ,bit) ( pin & (1< //example: gbi(GPIOA->IDR,0); #endif #endif #include"delay.h" #include"delay.h" /*********************** 函數(shù)功能:us延時 輸入?yún)?shù):無 輸出參數(shù):無 備 注:粗略延時 ***********************/ void delay_us(void) { asm("nop"); //一個asm("nop")函數(shù)經(jīng)過示波器測試代表100ns asm("nop"); asm("nop"); asm("nop"); } /*********************** 函數(shù)功能:ms延時 輸入?yún)?shù):無 輸出參數(shù):無 備 注:粗略延時 ***********************/ void delay_ms(unsigned int time) { unsigned int i; while(time--) for(i=900;i>0;i--) delay_us(); } #include "USART.h" #include "USART.h" #include "ALL_Includes.h" /************************** 函數(shù)功能:初始化UART 輸入?yún)?shù):SYS_Clk:系統(tǒng)時鐘(2,4,8,16) baud: 波特率 輸出參數(shù):無 備 注:無 ***************************/ void UART_Init(u8 SYS_Clk, u32 baud) { u16 UART_Temp; UART_IOConfig();//UART IO引腳初始化 UART1->CR2 = 0;// 禁止UART發(fā)送和接收 UART1->CR1 = 0;// b5 = 0,允許UART b2 = 0,禁止校驗 UART1->CR3 = 0;// b5,b4 = 00,1個停止位 /************************************************** 設置波特率,必須注意以下幾點: (1) 必須先寫B(tài)RR2 (2) BRR1存放的是分頻系數(shù)的第11位到第4位, (3) BRR2存放的是分頻系數(shù)的第15位到第12位,和第3位到第0位 例如對于波特率位9600時,分頻系數(shù)=2000000/9600=208 對應的十六進制數(shù)為00D0,BBR1=0D,BBR2=00 *************************************************/ UART_Temp = SYS_Clk*1000000/baud; UART1->BRR2 = (u8)((UART_Temp&0x000F)|((UART_Temp&0xF000)>>8)); UART1->BRR1 = (u8)((UART_Temp&0x0FF0)>>4); UART1->CR2 = 0x2C; // b3 = 1,允許發(fā)送 // b2 = 1,允許接收 // b5 = 1,允許產(chǎn)生接收中斷 } /************************************** 函數(shù)功能:從UART3發(fā)送一個字符 輸入?yún)?shù):ch -- 要發(fā)送的字符 輸出參數(shù):無 備 注:無 ***************************************/ void UART_SendChar(unsigned char ch) { while((UART1->SR & 0x80) == 0x00); // 若發(fā)送寄存器不空,則等待 UART1->DR = ch; // 將要發(fā)送的字符送到數(shù)據(jù)寄存器 } /*********************************** 函數(shù)功能:UART IO口初始化 輸入?yún)?shù):無 輸出參數(shù):無 備 注:IO在輸出模式下,可通過CR2寄存器 控制輸出速率 ***********************************/ void UART_IOConfig(void) { TXPort->DDR |= TXPin;//輸出模式 TXPort->CR1 |= TXPin;//推挽輸出 RXPort->DDR &=~RXPin;//輸入模式 RXPort->CR1 &=~RXPin;//浮空輸入 } #ifndef _USART_H #define _USART_H #include "ALL_Includes.h" //定義UART的TX、RX引腳 #define TXPort GPIOD #define TXPin (1 << 5) #define RXPort GPIOD #define RXPin (1 << 6) void UART_Init(u8 SYS_Clk, u32 baud); void UART_SendChar(unsigned char ch); void UART_IOConfig(void); #endif
上一篇:淺談STM8S(1)——I2C配置
下一篇:stm8——串口printf的實現(xiàn)
推薦閱讀
史海拾趣
設計資源 培訓 開發(fā)板 精華推薦
- AI時代的孩子,如何成為未來的開創(chuàng)者?
- 通用汽車轉(zhuǎn)向LFP電池,LG新能源和三星SDI擬在美建廠
- 蓋世汽車研究院:政策助推疊加技術(shù)迭代 全固態(tài)電池蓄勢待發(fā)
- 小鵬汽車董事長預測:2027年激光雷達非智能駕駛必備
- 解碼大眾汽車中國戰(zhàn)略 - 決戰(zhàn)智能化電氣化的三板斧
- 2025從具身智能大腦展望人形機器人發(fā)展
- “荊楚”人形機器人即將量產(chǎn),智能時代的新篇章!
- 小鵬純視覺方案:技術(shù)突圍與市場下沉的雙重博弈
- 為什么無人出租車能“零”事故,而智能駕駛輔助卻事故頻發(fā)?
- 重磅!一顆要顛覆全球智駕的芯片點亮了!