使用STM32的两个硬件SPI完成数据的读写,具体的见程序注释
1 /**************************(C) COPYRIGHT SunHao 2011***************************
2 名称:ADDA.c
3 功能:ADDA的相关配置以及读取函数
4 作者:孙浩
5 时间:2011.4.25
6 版本:1.0
7 注意:对照TLC2543时序图,确保对应时序一致,读写速度不宜太快
8 *******************************************************************************/
9 #include "STM32Lib//stm32f10x.h"
10 #include "hal.h"
12 #define A_OFF GPIO_ResetBits(GPIOF, GPIO_Pin_8)
13 #define A_ON GPIO_SetBits(GPIOF, GPIO_Pin_8)
14 #define B_OFF GPIO_ResetBits(GPIOF, GPIO_Pin_7)
15 #define B_ON GPIO_SetBits(GPIOF, GPIO_Pin_7)
16 #define C_OFF GPIO_ResetBits(GPIOF, GPIO_Pin_6)
17 #define C_ON GPIO_SetBits(GPIOF, GPIO_Pin_6)
18 /*******************************************************************************
19 名称:void ADDA_Config(void)
20 功能:配置ADDA对应的SPI和IO
21 参数:无
22 时间:2011.4.20
23 版本:1.0
24 注意:配置类似函数一定要注意外设时钟使能,所有用到引脚时钟使能
25 *******************************************************************************/
26 void ADDA_Config(void)
27 {
28 SPI_InitTypeDef SPI_InitStructure;
29 GPIO_InitTypeDef GPIO_InitStructure;
30 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
31 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
32 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF,ENABLE);
33 /*TLC2543相关IO口定义 */
34 /* PA5-SCK PA7-MOSI */
35 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5 |GPIO_Pin_7 ;
36 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
37 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
38 GPIO_Init(GPIOA, &GPIO_InitStructure);
39 /*PA4-CS*/
40 GPIO_SetBits(GPIOA, GPIO_Pin_4);
41 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
42 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
43 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
44 GPIO_Init(GPIOA, &GPIO_InitStructure);
45
46 /*PA6-MISO*/
47 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
48 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
49 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
50 GPIO_Init(GPIOA, &GPIO_InitStructure);
51
52 /*TLV5614相关IO口定义 */
53 /* PB13-SCK PB15-MOSI */
54 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13 |GPIO_Pin_15 ;
55 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
56 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
57 GPIO_Init(GPIOB, &GPIO_InitStructure);
58 /*PB12-CS PB11-FS*/
59 GPIO_SetBits(GPIOB, GPIO_Pin_11);//帧同步信号和片选信号初始化为高电平
60 GPIO_ResetBits(GPIOB, GPIO_Pin_12);
61 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
62 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
63 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
64 GPIO_Init(GPIOB, &GPIO_InitStructure);
65
66 /* SPI1 configuration 具体的SPI时序严格参照TLC2543数据手册*/
67 SPI_Cmd(SPI1, DISABLE); //必须先禁能,才能改变MODE
68 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
69 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主
70 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //16位
71 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟脚空闲时保持低电平
72 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //在第一个时钟沿采样数据信号
73 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS,片选信号由软件产生
74 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //256分频
75 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
76
77 SPI_Init(SPI1, &SPI_InitStructure);
78 SPI_Cmd(SPI1, ENABLE);
79 /* SPI2 configuration 具体的SPI时序严格参照TLV5614数据手册*/
80 SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE
81 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
82 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主
83 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //16位
84 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟脚空闲时保持低电平
85 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //在第一个时钟沿采样数据信号
86 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS,片选信号由软件产生
87 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //256分频
88 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
89
90 SPI_Init(SPI2, &SPI_InitStructure);
91 SPI_Cmd(SPI2, ENABLE);
92 //模拟开关通道选择IO口定义
93 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
94 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出
95 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
96 GPIO_Init(GPIOF, &GPIO_InitStructure);
97 A_OFF;
98 B_OFF;
99 C_OFF;
100 GPIO_SetBits(GPIOB, GPIO_Pin_11);//帧同步信号初始化为高电平
101 GPIO_ResetBits(GPIOB, GPIO_Pin_12);
102 }
103 /*******************************************************************************
104 名称:u16 Read_AD(u16 chan)
105 功能:读取对应通道的AD值
106 参数:chan对应的通道,取值0-15,返回值0-4095
107 时间:2011.4.20
108 版本:1.0
109 注意:后八个通道是通过模拟开关切换,受模拟开关切换速度影响,能够读取的速度要比
110 前八个通道慢
111 *******************************************************************************/
112 u16 Read_AD(u16 chan)
113 {
114 u16 i,ADCdata,chanaddr;
115 if(chan<=7)
116 {
117 chanaddr= chan <<12;
118 chanaddr|=0x0C00;
119 }
120 else
121 {
122 chanaddr=8;//通过模拟开关进行输入,模拟开关接入第八通道
123 chanaddr<<=12;
124 chanaddr|=0x0C00;
125 switch (chan)
126 {
127 case 8:
128 A_OFF;
129 B_OFF;
130 C_OFF;
131 break;
132 case 9:
133 A_ON;
134 B_OFF;
135 C_OFF;
136 break;
137 case 10:
138 A_OFF;
139 B_ON;
140 C_OFF;
141 break;
上一篇:CPLD被STM32读写VHDL程序
下一篇:STM32 在16位数据宽度下的地址问题
推荐阅读最新更新时间:2024-11-11 11:49
推荐帖子
- 怎么理解这个电路?
- 各位老师请教:这是个什么电路?U4、U5是光耦么?怎么理解这个电路怎么理解这个电路?两个N沟MOS管门极没有驱动门极的电源,如果U4U5是光耦,那么两个N沟MOS管不可能导通。所以,此电路不能工作。从两个N沟MOS管脚对脚串联于S1和S2之间,该电路可能是想要充当一个开关接入交流电路。但如前所述,两个MOS管不可能导通,所以不能起到开关作用。 工作肯定是能工作的,这是一个厂家的手册方案电路 【这是一个厂家的手册方案电路】既然是厂家的手册方案电路
- Knight97538 电源技术
- TDC-GP2与MSP430F413通讯C程序
- //TDC-GP2与MSP430F413通讯C程序//========================================#includemsp430x43x.h#includemath.h//#includeheat_meter.h//========================================#defineInit_GP20x70//初始化TDC#defineStart_Cycle0x01//脉
- fish001 微控制器 MCU
- 申请的LPC810开发板,晒照了。。。
- LPC810开发板上个星期就到了,最近太忙了,没来得及研究。先晒出几张照片,见见太阳。。。很精致的一块小板子,第一眼看到那个10P的接口,我瞬间醉了,太小了,还好接口都留出来了,后续学习再接出来使用。。。希望对我学习NXPLPC1100系列的片子有帮助。。。申请的LPC810开发板,晒照了。。。中间那个是主控LPC810吗?感觉好小啊。是找我们周立功申请的吗??周立功--中国最大的NXP代理和服务商,可以为你提供一切有关NXP的应用设计等的支持
- youyou_123 NXP MCU
- buck变换器问题求助
- 本人新手,行用buck做一个电源充电器,电池内阻2欧左右,我先使用的一个2欧的电阻代替电池作为负载,但问题是变换器的输入电压直接就检测到开路了,输入电压被拉的很低,只有一两伏。如果换一个电阻大一点的(30欧),就不会检测到开路。请教大神这是怎么回事啊。buck变换器问题求助比较简单的方法是,最好串个电流表弄个可调负载,能否达到设计的电流值。楼主对电池内阻的理解不正确所致。如果等效的话,电池可以用一理想电池再加一个电阻。不能仅一个电阻等效完事。“直接就检测到开路了”是检测到短路吧?
- 华南 电源技术
- 关于Zigebee网络通信实验的一些问题请教
- 最近在学习Zigbee,看到网络通信试验里无论是祖波还是广播或者点播,都会配置这么一句话:Point_To_Point_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;请问这个参数在组网中有什么作用呢?关于Zigebee网络通信实验的一些问题请教这个是用来建立网点的 能具体一点吗?刚入手不太理解 你用的是哪个平台? 网蜂的CC2530 链接:https://pan.baidu.com/s/11cy6TnxKNGGXj4jqUQeriQ
- 陈皮皮 RF/无线
- 【NUCLEO-WB09KE】开箱及开发环境测试
- 1、开发板介绍NUCLEO-WB09KE,其中核心MCUSTM32WB09KE为超低功耗ArmCortex-M0+MCU,运行频率64MHz,具有512KBFlash存储器、64KBRAM,支持BluetoothLE5.4。这个与ST公司推出的STM32WB的其它系列采用的是基于以64MHz运行的ArmCortex‐M4内核,该系列从结构上推断STM32WB0XX应该功耗要更低。Bluetooth低功耗5.4的传输距离更长,速度快的特点。我拿到手的STNUC
- bigbat RF/无线
设计资源 培训 开发板 精华推荐
- EVAL-ADV7844EB1Z,ADV7844 高质量、单芯片、四路 HDMI 1.4 快速开关接收器评估板
- USB串口快门线for/尼康D5100/宾得等老单反相机
- 使用 Analog Devices 的 LT3066IDE 的参考设计
- 贴片练习PCB名片兼工具卡
- OP184FSZ 2.5V 基准的典型应用在单 3V 电源上运行
- PT8211_PAM8403 I2S功放模块
- SimplePnP:个人用开源的PCB贴装机(含设计文件、原理图、源码、软件等)
- J-Link OB扩展板
- LTC7813IUH 宽输入范围至 5V/8A 低 IQ 级联升压+降压稳压器的典型应用电路(VMID 升压至 10V)
- BGA291(1620)固态颗粒转NVME固态转接板