STM8S1003 模拟SPI 驱动 SI4432

上关于stm8s1003 驱动si4432的 驱动不是很多 ,我也是弄了大半天才可以和si4432 spi驱动成功。 接下来要做无线收发和组网。

暂时先贴 spi驱动的

spi模拟方式:

main.c

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "stm8s.h"  
  2. #include "mytype.h"  
  3. #include"delay.h"  
  4. #include "USART.h"  
  5.   
  6. //定义CPU内部时钟  
  7. #define  SYS_CLOCK    16  
  8.   
  9. #define  SPIPort  GPIOC  
  10. #define  nMOSI  6  
  11. #define  nMISO  7  
  12. #define  nSCLK  5  
  13. #define  nCS    4  
  14. #define  MISO_G   gbi(SPIPort->IDR,nMISO)  
  15. #define  MOSI_H   sbi(SPIPort->ODR,nMOSI)  
  16. #define  MOSI_L   cbi(SPIPort->ODR,nMOSI)  
  17. #define  SCLK_H   sbi(SPIPort->ODR,nSCLK)  
  18. #define  SCLK_L   cbi(SPIPort->ODR,nSCLK)  
  19. #define  CS_H     sbi(SPIPort->ODR,nCS)  
  20. #define  CS_L     cbi(SPIPort->ODR,nCS)  
  21.   
  22.   
  23.   
  24. void CLOCK_Config(u8 SYS_CLK);  
  25.   
  26. /************************************************************************** 
  27.  * 函数名:SPI_Init 
  28.  * 描述  :SPI模块发送函数 
  29.  * 输入  :无 
  30.  * 返回  :无 
  31.  *************************************************************************/  
  32. void  SPI_Init(void)  
  33. {  
  34.         
  35.       cbi(SPIPort->DDR,nMISO);//MISO INPUT  
  36.       sbi(SPIPort->CR1,nMISO);  
  37.         
  38.       sbi(SPIPort->DDR,nMOSI);//MOSI OUTPUT  
  39.       sbi(SPIPort->CR1,nMOSI);  
  40.         
  41.       sbi(SPIPort->DDR,nSCLK);//SCLK OUTPUT  
  42.       sbi(SPIPort->CR1,nSCLK);  
  43.     
  44.       sbi(SPIPort->DDR,nCS);//CS OUTPUT  
  45.       sbi(SPIPort->CR1,nCS);  
  46. }  
  47.   
  48. /************************************************************************** 
  49.  * 函数名:SPI_SendByte 
  50.  * 描述  :SPI模块发送函数 
  51.  * 输入  :发送数据 
  52.  * 返回  :返回数据 
  53.  *************************************************************************/  
  54. u8 SPI_SendByte(u8 byte)  
  55. {       
  56.       u8 i = 0;  
  57.       u8 bit_r = 0;   
  58.       for(i=0;i<8;i++)   // output 8-bit  
  59.       {   
  60.         //MOSI_PIN=byte & 0x80;     //output 'byte' MSB to MOSI_PIN  
  61.         if(byte & 0x80)  
  62.             MOSI_H;  
  63.         else  
  64.             MOSI_L;  
  65.             
  66.           byte <<= 1;                 // shift next bit into MSB..  
  67.             
  68.           SCLK_H;  
  69.            
  70.           bit_r<<=1;  
  71.           if(MISO_G) bit_r++;  
  72.                       
  73.          SCLK_L;  
  74.             
  75.         //SCK_PIN=1 ;               // Set SCK_PIN high..  
  76.         //byte|=MISO_PIN;           // capture current MISO_PIN bit  
  77.         //SCK_PIN=0;                // then set SCK_PIN low again  
  78.       }  
  79.       return(bit_r);                        // return read byte  
  80. }  
  81.   
  82.   
  83.   
  84. /************************************************************************** 
  85.  * 函数名:SPI_ReadRegister 
  86.  * 描述  :SPI读取寄存器数值 
  87.  * 输入  :寄存器地址 
  88.  * 返回  :数据 
  89.  *************************************************************************/  
  90. u8 SPI_ReadRegister (u8 addr)  
  91. {  
  92.     u8 Result;  
  93.    
  94.     CS_L;    //nSEL = 0;    
  95.   
  96.     SPI_SendByte(addr);        //write data into the SPI register  
  97.     Result = SPI_SendByte(0xFF);  
  98.   
  99.     CS_H;    //nSEL = 1;  
  100.     return(Result);  
  101. }  
  102.   
  103. /************************************************************************** 
  104.  * 函数名:SPI_WriteRegister 
  105.  * 描述  :SPI写寄存器数值 
  106.  * 输入  :寄存器地址,数值 
  107.  * 返回  :无 
  108.  *************************************************************************/  
  109. void SPI_WriteRegister (u8 addr, u8 value)  
  110. {  
  111.    
  112.     CS_L;                  //nSEL = 1;                               
  113.           
  114.     SPI_SendByte(addr|0x80);            //write data into the SPI register    
  115.     SPI_SendByte(value);  
  116.   
  117.     CS_H;                  //nSEL = 1;  
  118.   
  119. }  
  120.   
  121. /************************************************************************** 
  122.  * 函数名:main 
  123.  * 描述  :主函数 
  124.  * 输入  :无 
  125.  * 返回  :无 
  126.  *************************************************************************/  
  127. int main(void)  
  128. {       
  129.       u8 temp = 0;  
  130.         
  131.       CLOCK_Config(SYS_CLOCK);//系统时钟初始化    
  132.       UART_Init(SYS_CLOCK,9600);  
  133.       SPI_Init();  
  134.     
  135.       while(1)  
  136.       {     
  137.   
  138.         temp =  SPI_ReadRegister(0x00);  
  139.         delay_ms(100);  
  140.         UART_SendChar(temp);  
  141.           
  142.         temp =  SPI_ReadRegister(0x09);  
  143.         delay_ms(100);  
  144.         UART_SendChar(temp);  
  145.       }  
  146.           
  147. }  
  148.   
  149. /************************************************************************** 
  150.  * 函数名:CLOCK_Config 
  151.  * 描述  :系统内部时钟配置 SYS_CLK : 2、4、8、16  系统启动默认内部2MHZ 
  152.  * 输入  :无 
  153.  * 返回  :无 
  154.  *************************************************************************/  
  155. void CLOCK_Config(u8 SYS_CLK)  
  156. {  
  157.    //时钟配置为内部RC,16M  
  158.    CLK->CKDIVR &=~(BIT(4)|BIT(3));  
  159.     
  160.    switch(SYS_CLK)  
  161.    {  
  162.       case 2: CLK->CKDIVR |=((1<<4)|(1<<3)); break;  
  163.       case 4: CLK->CKDIVR |=(1<<4); break;  
  164.       case 8: CLK->CKDIVR |=(1<<3); break;  
  165.    }  
  166. }  
#include "mytype.h"

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef __MyType_H  
  2. #define __MyType_H  
  3.   
  4.   
  5. #ifndef BIT  
  6. #define BIT(x)  (1 << (x))  
  7. #endif  
  8.   
  9. /* io configs */  
  10. #ifndef sbi    
  11. #define sbi(io,bit)     ( io  |=  (1<<bit) )  
  12. //example:sbi(GPIOA->ODR,0);sbi(GPIOA->DDR,0);  
  13. #endif   
  14.   
  15. #ifndef cbi    
  16. #define cbi(io,bit)     ( io  &= ~(1<<bit) )    
  17. //example:cbi(GPIOA->ODR,0);cbi(GPIOA->DDR,0);  
  18. #endif   
  19.   
  20. #ifndef xor    
  21. #define xor(port, bit)          (port) ^= (1 << (bit))  
  22. #endif  
  23.   
  24. #ifndef gbi    
  25. #define gbi(pin ,bit)   ( pin &   (1<<bit) )    
  26. //example: gbi(GPIOA->IDR,0);  
  27. #endif   
  28.   
  29.   
  30. #endif  

#include"delay.h"

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include"delay.h"  
  2.   
  3. /*********************** 
  4. 函数功能:us延时 
  5. 输入参数:无 
  6. 输出参数:无 
  7. 备    注:粗略延时 
  8. ***********************/  
  9. void delay_us(void)  
  10. {   
  11.     asm("nop"); //一个asm("nop")函数经过示波器测试代表100ns  
  12.     asm("nop");  
  13.     asm("nop");  
  14.     asm("nop");   
  15. }  
  16.   
  17. /*********************** 
  18. 函数功能:ms延时 
  19. 输入参数:无 
  20. 输出参数:无 
  21. 备    注:粗略延时 
  22. ***********************/  
  23. void delay_ms(unsigned int time)  
  24. {  
  25.     unsigned int i;  
  26.     while(time--)    
  27.     for(i=900;i>0;i--)  
  28.     delay_us();   
  29. }  

#include "USART.h"

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "USART.h"  
  2. #include "ALL_Includes.h"  
  3.   
  4.   
  5. /************************** 
  6. 函数功能:初始化UART 
  7. 输入参数:SYS_Clk:系统时钟(2,4,8,16) 
  8.          baud:   波特率 
  9. 输出参数:无 
  10. 备    注:无 
  11. ***************************/  
  12. void UART_Init(u8 SYS_Clk, u32 baud)  
  13. {     
  14.     u16 UART_Temp;  
  15.     
  16.     UART_IOConfig();//UART IO引脚初始化   
  17.     
  18.     UART1->CR2 = 0;// 禁止UART发送和接收  
  19.     UART1->CR1 = 0;// b5 = 0,允许UART  b2 = 0,禁止校验  
  20.                                                         
  21.     UART1->CR3 = 0;// b5,b4 = 00,1个停止位  
  22.                               
  23. /**************************************************  
  24.     设置波特率,必须注意以下几点: 
  25.     (1) 必须先写BRR2 
  26.     (2) BRR1存放的是分频系数的第11位到第4位, 
  27.     (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位 
  28.     例如对于波特率位9600时,分频系数=2000000/9600=208 
  29.     对应的十六进制数为00D0,BBR1=0D,BBR2=00 
  30. *************************************************/   
  31.       
  32.     UART_Temp = SYS_Clk*1000000/baud;  
  33.       
  34.     UART1->BRR2 = (u8)((UART_Temp&0x000F)|((UART_Temp&0xF000)>>8));  
  35.     UART1->BRR1 = (u8)((UART_Temp&0x0FF0)>>4);  
  36.                                                    
  37.                                       
  38.     UART1->CR2 = 0x2C; // b3 = 1,允许发送  
  39.                        // b2 = 1,允许接收  
  40.                        // b5 = 1,允许产生接收中断   
  41. }  
  42.   
  43. /************************************** 
  44. 函数功能:从UART3发送一个字符 
  45. 输入参数:ch -- 要发送的字符 
  46. 输出参数:无 
  47. 备    注:无 
  48. ***************************************/  
  49. void UART_SendChar(unsigned char ch)  
  50. {  
  51.      while((UART1->SR & 0x80) == 0x00);  // 若发送寄存器不空,则等待  
  52.      UART1->DR = ch;                     // 将要发送的字符送到数据寄存器    
  53. }  
  54.   
  55. /*********************************** 
  56. 函数功能:UART IO口初始化 
  57. 输入参数:无 
  58. 输出参数:无 
  59. 备   注:IO在输出模式下,可通过CR2寄存器 
  60.          控制输出速率 
  61. ***********************************/  
  62. void UART_IOConfig(void)  
  63. {   
  64.     TXPort->DDR |= TXPin;//输出模式  
  65.     TXPort->CR1 |= TXPin;//推挽输出     
  66.       
  67.     RXPort->DDR &=~RXPin;//输入模式  
  68.     RXPort->CR1 &=~RXPin;//浮空输入  
  69. }  
  70.   
  71.   
  72.    

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #ifndef  _USART_H  
  2. #define  _USART_H  
  3.   
  4. #include "ALL_Includes.h"  
  5.   
  6. //定义UART的TX、RX引脚  
  7. #define  TXPort  GPIOD  
  8. #define  TXPin   (1 << 5)   
  9. #define  RXPort  GPIOD  
  10. #define  RXPin   (1 << 6)  
  11.   
  12. void UART_Init(u8 SYS_Clk, u32 baud);  
  13. void UART_SendChar(unsigned char ch);  
  14. void UART_IOConfig(void);  
  15.   
  16.   
  17. #endif  
  18. from:http://blog.csdn.net/penglijiang/article/details/18447289
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值