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 INPUTsbi(SPIPort->CR1,nMISO);sbi(SPIPort->DDR,nMOSI);//MOSI OUTPUTsbi(SPIPort->CR1,nMOSI);sbi(SPIPort->DDR,nSCLK);//SCLK OUTPUTsbi(SPIPort->CR1,nSCLK);sbi(SPIPort->DDR,nCS);//CS OUTPUTsbi(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_PINif(byte & 0x80)MOSI_H;elseMOSI_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 registerResult = 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,16MCLK->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")函数经过示波器测试代表100nsasm("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相关推荐
- MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动
最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...
- 鸿蒙开发板Hi3861模拟SPI驱动JLX12864_LCD(UC1701X)_基于code-2.0
鸿蒙开发板驱动晶联讯LCDjlx12864_lcd_hi3861源码-C文档类资源-CSDN下载鸿蒙开发板驱动晶联讯LCDjlx12864_lcd_hi3861源码博文介绍https://t更多下载资 ...
- 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341
[全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...
- 鸿蒙开发板Hi3861模拟SPI驱动12864LCD_ST7920_基于code-2.0-CANARY
鸿蒙开发板Hi3861模拟SPI驱动12864LCD_ST7920源码.rar-C文档类资源-CSDN下载鸿蒙开发板Hi3861模拟SPI驱动12864LCD_ST7920源码.rar博文链接:htt ...
- 外设驱动库开发笔记43:GPIO模拟SPI驱动
SPI总线是我们常用的串行设备接口,一般情况下我们都会适应硬件SPI接口,但有些时候当硬件端口不足时,我们也希望可以使用软件来模拟SPI硬件接口,特别是要求不是很高的时候.在这一篇中我们将来讨论如 ...
- MAX535 单路13位DAC 模拟SPI驱动
一.MAX535 max535是低功耗.13位.电压输出DAC,采用串行接口和µMAX封装.MAX535通过单个+5V/3.3V电源工作,仅需要280µA电流工作. MAX535/MAX5351适用于 ...
- TLV5618 双路12位DAC 模拟SPI驱动
一.TLV65618芯片 TLV5618A 带掉电功能 2.7V-5.5V,低功耗双路 12 位数模转换器 特点 ●双路 12 位电压输出 DAC ●可编程调节转换时间 - 快速模式 3μs - 低速 ...
- 模拟SPI驱动SD卡
使用新唐的SDIO例子修改为SDH1始终驱动不了SD卡,所以使用模拟的方式驱动SD卡 头文件: #ifndef __SD_H #define __SD_H#include "NuMicro. ...
- 模拟SPI驱动W25Q16程序 (DSP 28X系列)
为了驱动SPI FLASH而写的驱动程序,写的时候主要是板子的自带SPI接口被占用,只好使用IO口模拟一个SPI接口程序: w25q16 芯片工作在SPI工作模式0和模式3中:在此spi的原理不多做说 ...
最新文章
- AMD桌面处理器Roadmap也已泄露
- windows下批量换程序——运维常用
- WebSocket API 学习笔记
- PhpSpreadsheet如何读取excel文件
- L1-021 重要的话说三遍 (5 分) — 团体程序设计天梯赛
- 不同VLAN间的通信
- XSS跨站脚本攻击和预防措施
- win7安装python3.7失败_win7安装python3.7出现setup failed,成功解决
- iOS之Apple ID双重认证与两步验证的区别
- 江西省赣州市谷歌高清卫星地图下载
- 原神 Android 教程 —安卓版
- CRM系统慢慢转为企业微信SCRM
- 日常生活中常用的五星级句子
- Spring Boot配置文件---约定大于配置
- 唇语识别!AI 领域的下一个万亿市场?
- FPS游戏外挂屡禁不止,如何破局?
- Windows 11 系统下载,正式版尚未发布
- 菜鸡做题·20200418会员登陆页面(CTF)
- 我的2021年度书单(主要教你面试怎么装B)
- c语言单目运算符和三目,6、单目运算符 双目运算符 三目运算符() 及 优先级的探讨!...
热门文章
- 【mysql】mysql查询优化之索引类型、最左前缀
- 北京大学优秀计算机论文,计算机系在ESEC/FSE'20上发表的论文获得ACM SIGSOFT杰出论文奖...
- 来看一位淘宝卖家是如何精确的运作微信营销的
- Taro 小程序开发大型实战(三):实现微信和支付宝多端登录
- 360校招笔试题总结3
- 在状态栏StatusBar中添加网速实时显示
- 新书推荐:iOS Swift 游戏开发指南
- 多道批处理操作系统和分时操作系统的概念
- 批处理系统脱机使用计算机,1.2.2 脱机输入/输出和批处理系统
- 微信小程序(uniapp)获取用户位置信息及选择位置