上关于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;
- }
- }
- #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
- from:http://blog.csdn.net/penglijiang/article/details/18447289