STM8S1003 模拟SPI 驱动 SI4432

网上关于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




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值