网上关于stm8s1003 驱动si4432的 驱动不是很多 ,我也是弄了大半天才可以和si4432 spi驱动成功。 接下来要做无线收发和组网。
暂时先贴 spi驱动的
spi模拟方式:
main.c
#include "stm8s.h"
#include "mytype.h"
#include"delay.h"
#include "USART.h"
//定义CPU内部时钟
#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);
/**************************************************************************
* 函数名:SPI_Init
* 描述 :SPI模块发送函数
* 输入 :无
* 返回 :无
*************************************************************************/
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);
}
/**************************************************************************
* 函数名:SPI_SendByte
* 描述 :SPI模块发送函数
* 输入 :发送数据
* 返回 :返回数据
*************************************************************************/
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
}
/**************************************************************************
* 函数名:SPI_ReadRegister
* 描述 :SPI读取寄存器数值
* 输入 :寄存器地址
* 返回 :数据
*************************************************************************/
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);
}
/**************************************************************************
* 函数名:SPI_WriteRegister
* 描述 :SPI写寄存器数值
* 输入 :寄存器地址,数值
* 返回 :无
*************************************************************************/
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;
}
/**************************************************************************
* 函数名:main
* 描述 :主函数
* 输入 :无
* 返回 :无
*************************************************************************/
int main(void)
{
u8 temp = 0;
CLOCK_Config(SYS_CLOCK);//系统时钟初始化
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);
}
}
/**************************************************************************
* 函数名:CLOCK_Config
* 描述 :系统内部时钟配置 SYS_CLK : 2、4、8、16 系统启动默认内部2MHZ
* 输入 :无
* 返回 :无
*************************************************************************/
void CLOCK_Config(u8 SYS_CLK)
{
//时钟配置为内部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" /*********************** 函数功能:us延时 输入参数:无 输出参数:无 备 注:粗略延时 ***********************/ void delay_us(void) { asm("nop"); //一个asm("nop")函数经过示波器测试代表100ns asm("nop"); asm("nop"); asm("nop"); } /*********************** 函数功能:ms延时 输入参数:无 输出参数:无 备 注:粗略延时 ***********************/ 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" /************************** 函数功能:初始化UART 输入参数:SYS_Clk:系统时钟(2,4,8,16) baud: 波特率 输出参数:无 备 注:无 ***************************/ void UART_Init(u8 SYS_Clk, u32 baud) { u16 UART_Temp; UART_IOConfig();//UART IO引脚初始化 UART1->CR2 = 0;// 禁止UART发送和接收 UART1->CR1 = 0;// b5 = 0,允许UART b2 = 0,禁止校验 UART1->CR3 = 0;// b5,b4 = 00,1个停止位 /************************************************** 设置波特率,必须注意以下几点: (1) 必须先写BRR2 (2) BRR1存放的是分频系数的第11位到第4位, (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位 例如对于波特率位9600时,分频系数=2000000/9600=208 对应的十六进制数为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,允许发送 // b2 = 1,允许接收 // b5 = 1,允许产生接收中断 } /************************************** 函数功能:从UART3发送一个字符 输入参数:ch -- 要发送的字符 输出参数:无 备 注:无 ***************************************/ void UART_SendChar(unsigned char ch) { while((UART1->SR & 0x80) == 0x00); // 若发送寄存器不空,则等待 UART1->DR = ch; // 将要发送的字符送到数据寄存器 } /*********************************** 函数功能:UART IO口初始化 输入参数:无 输出参数:无 备 注: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的实现
推荐阅读最新更新时间:2024-03-16 16:03