网上关于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"
#ifndef __MyType_H
#define __MyType_H
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
/* io configs */
#ifndef sbi
#define sbi(io,bit) ( io |= (1<<bit) )
//example:sbi(GPIOA->ODR,0);sbi(GPIOA->DDR,0);
#endif
#ifndef cbi
#define cbi(io,bit) ( io &= ~(1<<bit) )
//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<<bit) )
//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