硬件平台:STM32F103
SPI1初始化过程
static OS_EVENT *spi1_sem_event;
static void SPI1SemInit(void)
{
spi1_sem_event = OSSemCreate(1);
}
extern void SPI1SemGet(void)
{
uint8_t err;
OSSemPend(spi1_sem_event, 0, &err);
}
extern void SPI1SemPut(void)
{
OSSemPost(spi1_sem_event);
}
static void Spi1_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SPI1 and GPIO clocks */
/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
/*!< SPI_FLASH_SPI Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/*!< AFIO Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*!< Configure SPI_FLASH_SPI pins: SCK */
GPIO_InitStructure.GPIO_Pin = PIN_SPI1_SCLK;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(PORT_SPI1_SCLK, &GPIO_InitStructure);
/*!< Configure SPI_FLASH_SPI pins: MISO */
GPIO_InitStructure.GPIO_Pin = PIN_SPI1_MISO;
GPIO_Init(PORT_SPI1_MISO, &GPIO_InitStructure);
/*!< Configure SPI_FLASH_SPI pins: MOSI */
GPIO_InitStructure.GPIO_Pin = PIN_SPI1_MOSI;
GPIO_Init(PORT_SPI1_MOSI, &GPIO_InitStructure);
/* SPI1 configuration */
// W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
// Data on the DO and DIO pins are clocked out on the falling edge of CLK.
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
#if 0
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
#else
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第1个时钟沿
#endif
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//定义波特率预分频的值:波特率预分频值为2
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
SPI1SemInit();
}
extern void SPI1_SetSpeed(u8 SpeedSet)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//如果速度设置输入0,则低速模式,非0则高速模式
if(SpeedSet == 1)
{
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
}
else
{
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
}
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
}
extern void spi1WriteData(Uchar *buf,Uint len)
{
for (; len ; len--,buf++)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, *buf);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
}
}
extern u8 SPI1_Swap_DataMSB(u8 byte)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, byte); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
SPI2初始化过程
static OS_EVENT *spi2_sem_event;
static void SPI2SemInit(void)
{
spi2_sem_event = OSSemCreate(1);
}
extern void SPI2SemGet(void)
{
uint8_t err;
OSSemPend(spi2_sem_event, 0, &err);
}
extern void SPI2SemPut(void)
{
OSSemPost(spi2_sem_event);
}
extern void Spi2_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/*!< AFIO Periph clock enable */
//RCC_APB2PeriphClockCmd(RCC_APB1Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = PIN_SPI2_SCLK;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(PORT_SPI2_SCLK, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_SPI2_MISO;
GPIO_Init(PORT_SPI2_MISO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_SPI2_MOSI;
GPIO_Init(PORT_SPI2_MOSI, &GPIO_InitStructure);
/* SPI2 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
#if 1
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
#else
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第1个时钟沿
#endif
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);
SPI2SemInit();
}
/*******************************************************************************
* Function Name : SPI_SetSpeed
* Description : SPI设置速度为高速
* Input : u8 SpeedSet
* 如果速度设置输入0,则低速模式,非0则高速模式
* SPI_SPEED_HIGH 1
* SPI_SPEED_LOW 0
* Output : None
* Return : None
*******************************************************************************/
void SPI2_SetSpeed(u8 SpeedSet)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//如果速度设置输入0,则低速模式,非0则高速模式
if(SpeedSet == 1)
{
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
}
else
{
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
}
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
}
extern void spi2WriteData(Uchar *buf,Uint len)
{
for (; len ; len--,buf++)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, *buf);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI2);
}
}
extern u8 SPI2_Swap_DataMSB(u8 byte)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI2, byte);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2);
}
SPI3初始化过程
static OS_EVENT *spi3_sem_event;
static void SPI3SemInit(void)
{
spi3_sem_event = OSSemCreate(1);
}
extern void SPI3SemGet(void)
{
uint8_t err;
OSSemPend(spi3_sem_event, 0, &err);
}
extern void SPI3SemPut(void)
{
OSSemPost(spi3_sem_event);
}
static void Spi3_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SPI1 and GPIO clocks */
上一篇:STM32F103使用SPI3总结
下一篇:msp430输出PWM波
推荐阅读
史海拾趣
在竞争激烈的电子行业中,DBM Optix深知只有不断创新才能保持领先地位。因此,公司始终将研发作为核心竞争力之一,持续投入大量资金用于新技术、新产品的开发。通过与高校、研究机构等合作,DBM Optix不断引入新技术、新材料,并将其应用于产品中,从而不断提升产品的性能和品质。这些创新举措使得DBM Optix在光学通信领域始终保持领先地位。
Holt在支持ARINC 429标准方面展现出了强大的实力。其ARINC 429 IC产品系列从简单的线路接收器到集成RAM的完整协议解决方案,覆盖了业内最广泛的范围。这些产品设计精巧,能够在单个3.3V电源上运行,显著降低了系统复杂性和板空间,为航空电子系统带来了更高的效率和可靠性。Holt的这一系列创新产品,不仅满足了航空制造商的严格需求,也推动了ARINC 429标准在全球范围内的广泛应用。
自成立以来,ASPEED Technology一直致力于自主创新技术的研发与客户需求的快速响应。公司拥有一支专业的研发团队,不断推出具有竞争力的新产品和解决方案。同时,ASPEED还积极拓展全球市场,与众多知名企业和机构建立了合作关系,为公司的发展奠定了坚实的基础。正是这种持续的创新与研发精神,使得ASPEED在电子行业中不断发展壮大,成为了一家备受瞩目的企业。
以上五个故事均基于ASPEED Technology公司发展起来的相关事实,展现了公司在并购、产品创新、合作研发等方面的努力和成果。这些故事不仅反映了ASPEED在电子行业中的成长轨迹,也展示了其不断追求卓越、推动行业发展的决心和实力。
华润微的前身可以追溯到1983年成立的香港华科电子公司。这家公司在电子行业中默默耕耘,逐渐积累了技术实力和市场份额。1999年,公司开始涉足6英寸晶圆代工业务,标志着其向半导体制造领域的进军。经过数年的发展和积累,华润微于2002年收购了中国华晶电子集团公司,进一步扩大了其业务范围和市场份额。此后,华润微不断壮大,逐步成为电子行业的佼佼者。
在电子行业中,供应链管理和成本控制对于企业的生存和发展至关重要。Chipcera深知这一点,因此在供应链方面进行了精细化管理。公司与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,公司还通过优化生产流程、提高生产效率等方式,有效降低了生产成本。这些措施使得Chipcera能够在激烈的市场竞争中保持价格优势,提升市场竞争力。
在电子行业中,产品质量是企业生存和发展的关键。CDI-DIODE公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品检测,都严格把关。这种对品质的执着追求赢得了客户的信任和口碑,使公司在激烈的市场竞争中脱颖而出。
老手讲心得,新手讲迷惑 每个人都经历过初学阶段,有些很顺利,有些则很曲折,有些甚至还在徘徊!更有一些感叹!那就都在这说出来吧,说说自己的经历,自己难忘的经历!当作是一种回味,也给后来人一些经验和教训! 新手也要抓紧时间,有 ...… 查看全部问答∨ |
抽象又复杂的数位高速逻辑原理,与传输线中方波讯号的如何传送, 以及如何确保其讯号完整性(Signal Integrity),降低其杂讯(Noise)减少之误动作等专业表达,若能以简单的生活实例加以说明,而非动则搬来一堆数学公式与难懂的物理语言者,则对新 ...… 查看全部问答∨ |
开发初期,wince的SDK版本不稳定,需要升级多次,怎么样能使在原SDK上开发的应用程序不用进行修改,或只需要修改应用程序的配置就可以了? 就是说对于上层应用程序来说,只需要重新安装新的SDK,不需要重建工程… 查看全部问答∨ |
规划未来2年的路线:开发20款ARM/MIPS开发板,请大家帮忙芯片选型和推荐! 目前已经成功开发了 S3C44B0X、S3C2410、S3C2440、AT91SAM9260、AT91SAM9261、AT91SAM9263、JZ4755。 接着打算做 PXA270(目前市场上还有不少270芯片,可以低价购买) PXA310(这个暂时还犹豫不决,还没找到合适的SDK) S3C2416(资料丰富,批量价 ...… 查看全部问答∨ |
100分求硬盘UBA(UNIT BLOCK ADDRESSING)寻址方式的资料 求硬盘UBA(UNIT BLOCK ADDRESSING)寻址方式的资料 不是普通的chs或lba寻址,uba寻址是和硬盘的固件区相关的 贴链接,贴例子都可以 只要和uba有关的都给分 顶者给分 chs或lba的资料的不给分 … 查看全部问答∨ |
|
本帖最后由 ddllxxrr 于 2016-1-7 17:00 编辑 RT. 笔记本的坏了,新的太贵。买个旧的来用着先。联系QQ523335234 注明硬盘 … 查看全部问答∨ |
|
环保节能概念是当今时尚的话题,照明用电节能最好的方法是使用LED节能灯,LED节能灯不但节能,而且有寿命长等优点,深受人们欢迎!现为大家介绍一款可以自己打造的LED节能灯制作及过程,希望大家可以在制作动起手来,也 ...… 查看全部问答∨ |
最近做称重方面的计量。遇到的问题: 称重传感器的推荐激励电压是10V。 选用了CS5532的这个芯片。 。为了减少干扰,想采取比率的电路接法。也就是把芯片的参考电压由称重传感器的工作电压分压得到。 查阅了网上的很多资 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 开学季!EEworld下载中心 Cortex主题资源上传
- 3.5\"嵌入式主板给力开团 仅售599元包邮!
- 参会领开发板盲盒:2023 RT-Thread开发者大会报名啦!
- 从终端到架构,TE Connectivity(TE)助你连接5G高速未来 看视频答题赢好礼!
- 瑞萨电子RL78/G14 demo板低价开团 19.9元包邮
- 直播已结束|Littelfuse 智能楼宇电子设备安全与可靠性解决方案
- 兆易GD32307E-START免费测评试用
- 如何读懂牛掰的USB Tybe-C新闻稿!
- Keysight感恩月:每天送出一台示波器,一次注册即可参与
- 【EE团】铁电MSP-EXP430FR5739低价来袭,让你的夏日清凉到底!