历史上的今天
今天是:2024年10月10日(星期四)
2020年10月10日 | STM32的SPI查询方式传输测试
2020-10-10 来源:elecfans
环境:
主机:WIN7
开发环境:MDK4.23
MCU:STM32F103CBT6
说明:
软件设置NSS脚,利用查询方式传输
源代码:
初始化代码:
//关闭SPI
SPI_Cmd(SPI1,DISABLE);
//初始化SPI接口的SSN脚以及NTRX的RST脚
NtrxCtrlInit();
//初始化SPI时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA,ENABLE);
//配置SPI1引脚:SCK, MISO and MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_Init( GPIOA, &GPIO_InitStructure );
// SPI1配置
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_Low ;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;
//SPI波特率分频设置:4M
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8 ;
//SPI设置成LSB模式
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB ;
SPI_InitStructure.SPI_CRCPolynomial = 7 ;
SPI_Init( SPI1, &SPI_InitStructure ) ;
//启动SPI
SPI_Cmd(SPI1,ENABLE);
发送代码:
//SPI发送一个字节
static uint8 SPI_SendByte(uint8 Data)
{
// Loop while DR register in not emplty
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;
// Send byte through the SPI1 peripheral
SPI_I2S_SendData( SPI1, Data ) ;
// Wait to receive a byte
while( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;
// Return the byte read from the SPI bus
return SPI_I2S_ReceiveData( SPI1 ) ;
}
接收代码:
//SPI读取一个字节
void SPI_ReadBytes( uint8 Addr, NtrxBufferPtr Buffer, uint8 Len )
{
if( ( Len > 0x80 ) || ( Len == 0 ) )
Len = 1 ;
SPI_SendByte( Len ) ;
SPI_SendByte( Addr ) ;
while( Len-- )
{
*Buffer = SPI_SendByte( 0xFF ) ;
Buffer ++ ;
}
}
NSS脚电平设置:
//SSN脚拉低,开始发送数据
void NtrxSSN_Lo( void )
{
GPIO_ResetBits( NTRX_SSN_PORT, NTRX_SSN_PIN ) ;
}
//SSN脚置高,结束发送数据
void NtrxSSN_Hi( void )
{
GPIO_SetBits( NTRX_SSN_PORT, NTRX_SSN_PIN ) ;
}
示例代码:
uint8 NtrxReadSingleSPI( uint8 Addr )
{
NtrxBufferType r ;
NtrxSSN_Lo() ;
SPI_ReadBytes( Addr, &r, 1 ) ;
NtrxSSN_Hi() ;
return r ;
}
输出:

黄线为NSS脚电平,蓝线为CLK电平.
史海拾趣
|
我需要一个放大电路,它的要求是把我现有的一个0.6V的开关,放大成3.0V的开关,最后是要控制发光二极管亮灭,可以提供12.0V电源,哪位高人可以帮忙设计或有成品电路可以用请提供一下信息啊?… 查看全部问答> |
|
我是一个嵌入式linux开发的新手,现在想自学驱动开发,但是我一直有个疑问,请您指教: 我到底先读《linux设备驱动程序(第三版)》和宋老师编著的《linux设备驱动开发详解》哪一本书?我很苦恼。。。… 查看全部问答> |
|
c8051f 单片机(c2 ,jtag)和at89s5x单片机(isp)二合一串口编程下载线,支持3伏(c8051f 单片机),5伏(at89s5x单片机)电源, 目前通过实际验证可编程下载的芯片:c8051f310、c8051f320、c8051f330D、c8051f340、c8051f350、c8051f360、c8051f4 ...… 查看全部问答> |
|
1. 何处可以得到 STM32L151 的片子; 2. STM32L151 的内部时钟可以支持 USB吗? 3. IAR5.3 +jilink 7 可以支持STM32L151? 谢谢!… 查看全部问答> |
|
我设置了开机密码但是无法弹出软键盘,这样没办法进入系统也没办法关机,请教如何关闭密码或者调出软键盘 是windows CE6.0的 谢谢各位大大了! [ 本帖最后由 qty0 于 2011-7-28 20:21 编辑 ]… 查看全部问答> |




