STM8S1003 模拟SPI 驱动 SI4432

发布者:Lihua1314520最新更新时间:2018-05-31 来源: eefocus关键字: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"

[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  



关键字:STM8S1003  模拟SPI  驱动  SI4432 引用地址:STM8S1003 模拟SPI 驱动 SI4432

上一篇:浅谈STM8S(1)——I2C配置
下一篇:stm8——串口printf的实现

推荐阅读最新更新时间:2024-03-16 16:03

LNK405EG: 15W PAR38 TRIAC调光LED驱动方案
本文介绍了Powerint公司的高功率因数(PF)TRIAC调光LED驱动器。该驱动器设计用以驱动30V(在0.5A的电流下)的额定led串电压,其输入电压范围为180VAC~265VAC。该LED驱动器采用了LinkSwitch-PH系列IC的LNK405EG。 LinkSwitch-PH IC实现了低成本、低元件数LED驱动器,既满足了功率因数和谐波限制,又加强了终端用户体验。它具有极广的调光范围、无闪烁操作(甚至具有AC线路TRIAC调光器的成本特性)、快速和清洁开启特性。 它采用隔离型反激拓扑结构,在连续导通模式下运行。完全通过一次侧感应输出电流调节,从而消除了对二次侧反馈元件的需求。由于这是在IC内部执行的,所以一次侧无需
[电源管理]
LNK405EG: 15W PAR38 TRIAC调光LED<font color='red'>驱动</font>方案
Synaptics两款全新ClearView OLED显示驱动器IC 现已出样
Synaptics(NASDAQ:SYNA)今日宣布,推出两款全新解决方案R66455(FHD+)和R66451(WQHD+),进一步扩展其OLED显示驱动器IC(DDIC)产品组合。功能丰富的Synaptics ® ClearView ™ R66455和R66451 DDIC集成了Synaptics领先的图像处理技术和全新的前沿技术,旨在增强OLED显示屏效果。两款解决方案的主要特性包括支持高至20:9的超长显示屏,以及支持屏幕圆角和凹口设计,可更好适配摄像头和传感器。 Synaptics高级副总裁兼移动部门总经理Kevin Barber表示:“Synaptics是一个值得信赖的技术领导品牌,与全球显示制造商保持着深厚的合作
[半导体设计/制造]
聚积携手三星等客户参展荷兰ISE展 展示下一代屏驱动IC效果
芯科技消息(文/方中同)发光二极管(LED)驱动IC厂商聚积宣布将于2月5日展开的荷兰欧洲系统整合展(ISE 2019)盛会上展示最新的HDR-Optimized LED显示器驱动IC显示效果,以及mini-LED显示器方案。 此前,聚积在今年元月初的CES展上,与多家知名客户共同开发下一代显示器,并如期地在展览上惊艳亮相,其中也包含韩国三星的次毫米发光二极管(mini LED)显示器,以及微发光二极管(micro LED)显示器。 聚积表示,前瞻LED显示器蓬勃发展,2017年起通过供应商评鉴,成为三星集团内重要的LED显示器驱动IC伙伴,协助三星开发前瞻创新的LED显示器产品。 聚积介绍,如在CES上率先推出支持HDR最高规格
[手机便携]
OLED量产/LCD扩产驱动 京东方未来业绩增长可期
  1月26日,京东方发布《2017年业绩预告》称,公司预计2017年实现归属于上市公司股东的净利润75亿元-78亿元,同比增长298%-314%。2016年,公司实现净利润18.83亿元。下面就随嵌入式小编一起来了解一下相关内容吧。   2017年,京东方进一步推动战略转型升级,坚定执行DSH事业战略,持续推进显示产品结构优化,快速布局新业务领域。随着核心技术创新能力的提升,传统产品市场份额继续维持在较高水平,新应用细分市场拓展成果显著。   此外,京东方持续强化精益管理,提升高附加值产品导入速度和出货比重,公司整体盈利能力稳定在较高水平。加之2017年半导体显示行业景气度较好,公司经营业绩较上年同期大幅提升。    大尺寸
[嵌入式]
感知万物,驱动数字未来,星纵物联泛园区合作伙伴大会在广州举办
6月13日,由 星纵物联主办,尚阳股份、熵基科技、深圳思倍云、睿威通信共同协办的“感知万物,驱动数字未来”泛园区合作伙伴大会(广州站),在羊城广州成功举办 。大会汇聚了广东地区180+合作伙伴,共同就“泛园区智能化升级”主题进行深度交流,为数字感知大背景下的泛园区智能化建设与发展赋能。 大会现场 大会开场,星纵物联战略合作伙伴、活动特邀嘉宾——Semtech 市场战略总监甘泉,以《LoRa®助力智慧园区》为题,为大家进行了分享。在分享中,甘泉着重介绍了LoRa®无线通信技术的整体生态环境、技术特点,及该技术在智慧楼宇、智慧园区等领域的应用,让与会来宾对LoRa®和LoRaWAN®有了更清晰、更深度的认知。 Se
[物联网]
感知万物,<font color='red'>驱动</font>数字未来,星纵物联泛园区合作伙伴大会在广州举办
51单片机驱动伺服电机程序
51单片机除了几款加强版的带pwm,很多都不带,所以要用51控制伺服电机很多时候就要软件模拟pwm。看了些代码有的是通过延时来输出pwm波,有的也用了定时器但是那些代码要驱动多路伺服电路就显得比较麻烦。下面的代码是通过定时器0产生每0.5ms一次的提醒,程序在大循环中通过调用DJ()函数可以返还值给伺服电机信号引脚,DJ()函数可以定旋转的角度,但是因为定时器设置是0.5ms的中断这就决定了旋转呢角度只能是-45,-90,0,45,90。如果要提高精度就要通过设置定时器的初值,改变函数的num值来达成。 #include reg52.h unsigned int num=0; //舵机 sbit DJ1=P3^6; sbit DJ
[单片机]
Arm-Linux摄像头驱动程序的移植
Arm开发板上摄像头的移植有两种方法:第一,将驱动程序添加到内核,通过编译内核,烧写到板子上;第二种,通过动态加载摄像头驱动模块的方法进行硬件的驱动。作者首先在PC的linux系统进行摄像驱动程序的移植,保证驱动程序版本正确,然后将驱动程序编译成模块,通过文件系统挂载到板子,然后进行加载,进而创建摄像头设备节点。下面将具体介绍摄像头动态加载的过程。 移植过程所使用的摄像头型号ZC301P,arm板上的内核版本为2.6.9,开发板为pxa270,所采用的驱动程序包为spca5xx-20060501.tar.gz。 第一步,使用命令解压文件: tar zxvf spca5xx-20060501.tar.gz
[单片机]
STM32CubeMx之SD卡驱动
1. SD 卡简介 SD存储卡(Secure Digital Mem or y Card)是一种基于 半导体 快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card)格式上发展而来,在兼容SD存储卡基础上发展了 SDI O(SD Input/ Output)卡,此兼容性包括 机械 , 电子 ,电力, 信号 和软件,通常将SD、SDIO卡俗称SD存储卡。 SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如 数码 相机、平板 电脑 和多媒体播放器等。 SD卡支持两种总线方式:SD方式与SPI方式。其中 SD 方式采用 6 线制,使用 CLK、
[单片机]
STM32CubeMx之SD卡<font color='red'>驱动</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved