历史上的今天
返回首页

历史上的今天

今天是:2025年05月31日(星期六)

2018年05月31日 | STM8S1003 模拟SPI 驱动 SI4432

2018-05-31 来源:eefocus

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



推荐阅读

史海拾趣

Allied Controls Incorporated公司的发展小趣事

Allied Controls Incorporated(ACI)是一家专注于设计和制造温度传感器和控制器的公司,以下是其发展历程的五个相关故事:

  1. 创立和早期发展: Allied Controls Incorporated成立于1983年,总部位于美国新泽西州。公司的创始人是一群对温度控制技术充满热情的工程师和企业家。起初,ACI专注于为工业和商业应用提供高品质的温度传感器和控制器。通过不断提高产品质量和性能,公司逐渐赢得了客户的信任和好评,实现了良好的初期发展。

  2. 技术创新与产品优化: 随着市场需求的变化和技术的发展,ACI不断进行技术创新,并不断优化其产品线。公司投入大量资源用于研发新型温度传感器和控制器,以满足不同行业的需求。ACI的工程团队与客户紧密合作,根据客户的反馈和需求不断改进产品设计和性能,确保产品的质量和可靠性。

  3. 扩大市场份额: 随着业务的稳步增长,ACI逐渐扩大了其市场份额,涵盖了更多的行业和应用领域。除了工业和商业应用外,公司还开始进军医疗、航空航天、汽车和消费电子等领域。通过开发定制化解决方案和与行业领先企业合作,ACI成功地拓展了其市场份额,并在各个行业中树立了良好的声誉。

  4. 国际市场拓展: 除了在美国市场取得成功外,ACI还积极拓展国际市场。公司与全球各地的合作伙伴建立了稳固的合作关系,拓展了产品的销售网络。ACI的产品出口到欧洲、亚洲和其他地区,赢得了国际客户的青睐和认可。通过不断开拓国际市场,ACI进一步巩固了其在全球温度传感器和控制器领域的领先地位。

  5. 持续创新和发展: 作为一家技术驱动型公司,ACI致力于持续创新和发展。公司不断投入研发和技术改进,推出更加先进和高性能的产品。ACI的工程团队不断探索新的技术和解决方案,以满足客户日益增长的需求。通过不断创新和发展,ACI得以在电子行业中保持竞争优势,并为客户提供更加可靠和高效的温度控制解决方案。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

Gwconnect (Molex)公司的发展小趣事
由于元件参数可能受温度、湿度等环境因素影响,电路的稳定性相对较差。
Golledge Electronics公司的发展小趣事
利用超声波传感器发射超声波并接收回波,通过测量时间差来计算距离,广泛应用于汽车泊车辅助、机器人导航等领域。
D+H Mechatronic AG公司的发展小趣事

D+H Mechatronic AG深知人才是企业发展的核心。因此,公司一直致力于培养和引进优秀人才,并建立了完善的培训体系。通过内部培训和外部引进相结合的方式,公司成功打造了一支高素质、专业化的技术和管理团队。这支团队不仅具备丰富的专业知识和实践经验,还具备良好的创新意识和团队协作精神。他们的努力为公司的发展提供了源源不断的动力。

国芯佳品公司的发展小趣事

D+H Mechatronic AG深知人才是企业发展的核心。因此,公司一直致力于培养和引进优秀人才,并建立了完善的培训体系。通过内部培训和外部引进相结合的方式,公司成功打造了一支高素质、专业化的技术和管理团队。这支团队不仅具备丰富的专业知识和实践经验,还具备良好的创新意识和团队协作精神。他们的努力为公司的发展提供了源源不断的动力。

问答坊 | AI 解惑

2.4GHz射频芯片CC2420实现ZigBee无线通信设备

2.4GHz射频芯片CC2420实现ZigBee无线通信…

查看全部问答>

什么是看门狗?

看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到 ...…

查看全部问答>

交流是技术展开的平台

建议多出来活动,交流技术、心得,没准哪个网友的一句话会对我们的工作有帮助!…

查看全部问答>

变压器绕制问题

公司一直没有变压器绕制装备;每次做电源,都要找外厂做变压器,有时候对变压器就是做个微小的调整都要 经历很长的时间,甚至老被人忽悠,一拖再拖;严重影响驱动板的开发周期,有时候真是无语。那么自己 绕制变压器,至少得哪些材料装备;知道吗 ...…

查看全部问答>

MODEM怎样读取对方电话按键值

查了一些资料说是 必须是语音模式(AT+FCLASS=8) 用 AT+VLS=1 应答 然后输入按键值(如#键) 显示为  / 按键值(#) ~ 我试了一下结果却是这样的,为啥呢。。 AT+FCLASS=8 设置语音模式 R R R      响铃 AT+VLS ...…

查看全部问答>

vxworks启动后的排场不够大?

我刚用wmware配置的wxworks5.5为什么成功启动后没有显示很大的VxWorks的欢迎界面,而是很普通的几行字?…

查看全部问答>

我用的是VS2003的C#来开发WINCE4.2的应用程序....现在遇到了问题.

问题是: 我把应用程序关闭了,但发现程序还在运行,     有什么方式看我的程序里面的什么对象在运行? 注:我的板子是2410的,WINCE4.2版的操作系统,PC机开发软件是VS2003的C#. …

查看全部问答>

mcc6402是PIC的MCU吗?

请问各位大侠mcc6402是PIC的MCU吗?是那个型号?谢谢…

查看全部问答>