亲爱的帮手和编码神,我想用程序应用程序keill在stm32f0上制作一个spi连接到点阵的乒乓球游戏,以及硬件,MAX7219点阵模块8x8与SPI1通信到8x8 LED矩阵。 点阵接5v、gnd、pa7、pa4和pa5以及
我的问题是如何通过 spi 连接将内容写入屏幕以玩游戏,但首先是 h 或其他一些简单的东西。因为我不知道我做错了什么。 dac 与程序无关。
下面是我的代码,只需将 h 写入屏幕,这样我就可以开始编写游戏代码了。但是 het 没有写 annuthing,我的编辑器 keill 说函数 SPI_I2S_SendData 的隐式声明
/******************************************************************************
* File : Main program - Single Mode
*****************************************************************************/
#include "stm32f0xx.h"
#include "stm32f0_discovery.h"
#include "helper.h"
#include "stm32f0xx_gpio.h"
//#include "stm32f0xx_spi.h"
/* SPI1 pin definition */
#define SPI1_SCK_PIN GPIO_Pin_5
#define SPI1_MISO_PIN GPIO_Pin_4
#define SPI1_MOSI_PIN GPIO_Pin_7
#define SPI1_GPIO_PORT GPIOA
#define SPI1_GPIO_CLK RCC_AHBPeriph_GPIOA
/* MAX7219 command definitions */
#define MAX7219_NOOP 0x00
#define MAX72`19_DIGIT0 0x01
#define MAX7219_DIGIT1 0x02
#define MAX7219_DIGIT2 0x03
#define MAX7219_DIGIT3 0x04
#define MAX7219_DIGIT4 0x05
#define MAX7219_DIGIT5 0x06
#define MAX7219_DIGIT6 0x07
#define MAX7219_DIGIT7 0x08
#define MAX7219_DECODEMODE 0x09
#define MAX7219_INTENSITY 0x0A
#define MAX7219_SCANLIMIT 0x0B
#define MAX7219_SHUTDOWN 0x0C
#define MAX7219_DISPLAYTEST 0x0F
/* Function prototypes */
void SPI1_Init(void);
void MAX7219_Init(void);
void MAX7219_SendData(uint8_t reg, uint8_t data);
int main(void)
{
/* Initialize SPI1 */
SPI1_Init();
/* Initialize MAX7219 */
MAX7219_Init();
/* Main loop */
while (1)
{
/* Display a "H" character on the matrix */
MAX7219_SendData(MAX7219_DIGIT0, 0x7E);
MAX7219_SendData(MAX7219_DIGIT1, 0x09);
MAX7219_SendData(MAX7219_DIGIT2, 0x09);
MAX7219_SendData(MAX7219_DIGIT3, 0x7E);
MAX7219_SendData(MAX7219_DIGIT4, 0x00);
MAX7219_SendData(MAX7219_DIGIT5, 0x00);
MAX7219_SendData(MAX7219_DIGIT6, 0x00);
MAX7219_SendData(MAX7219_DIGIT7, 0x00);
}
}
/* Initialize SPI1 */
void SPI1_Init(void)
{
SPI_InitTypeDef SPI_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
/* Enable SPI1 and GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
RCC_AHBPeriphClockCmd(SPI1_GPIO_CLK, ENABLE);
/* Configure SPI1 pins: SCK, MISO and MOSI */
GPIO_InitStruct.GPIO_Pin = SPI1_SCK_PIN | SPI1_MISO_PIN | SPI1_MOSI_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SPI1_GPIO_PORT, &GPIO_InitStruct);
/* Connect SPI1 pins to AF */
GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource5, GPIO_AF_0); // SCK
GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource6, GPIO_AF_0); // MISO
GPIO_PinAFConfig(SPI1_GPIO_PORT, GPIO_PinSource7, GPIO_AF_0); // MOSI
/* Configure SPI1 */
SPI_StructInit(&SPI_InitStruct);
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_Init(SPI1, &SPI_InitStruct);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
/* Initialize MAX7219 */
void MAX7219_Init(void)
{
/* Configure SPI1 */
SPI1_Init();
/* Send initialization data to MAX7219 */
MAX7219_SendData(MAX7219_SCANLIMIT, 0x07); // Display all digits
MAX7219_SendData(MAX7219_DECODEMODE, 0x00); // No decoding
MAX7219_SendData(MAX7219_SHUTDOWN, 0x01); // Normal operation
MAX7219_SendData(MAX7219_DISPLAYTEST, 0x00); // No display test
MAX7219_SendData(MAX7219_INTENSITY, 0x0F); // Maximum intensity
}
/* Send data to MAX7219 */
void MAX7219_SendData(uint8_t reg, uint8_t data)
{
/* Select MAX7219 */
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
/* Send data */
SPI_I2S_SendData(SPI1, reg);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET) {}
SPI_I2S_SendData(SPI1, data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET) {}
/* Deselect MAX7219 */
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
// ----------------------------------------------------------------------------
// Function prototypes
// ----------------------------------------------------------------------------
void DAC_Setup(void);
// ----------------------------------------------------------------------------
// Main
// ----------------------------------------------------------------------------
int main2(void)
{
uint32_t i;
// Configure LED3 and LED4 on STM32F0-Discovery
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
// Initialize User Button on STM32F0-Discovery
STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);
DAC_Setup();
while(1)
{
// Assuming Uled = 1.8 V
// (4095 * 1.8) / 3 = 2457
for(i=4095; i>2457; i--)
{
Delay(SystemCoreClock/8/1000);
DAC_SetChannel1Data(DAC_Align_12b_R, i);
}
for(i=2457; i<=4095; i++)
{
Delay(SystemCoreClock/8/1000);
DAC_SetChannel1Data(DAC_Align_12b_R, i);
}
}
}
/**
* @brief This function sets PA4 to analog mode and initializes
* DAC1.
* @param None
* @retval None
*/
void DAC_Setup(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
//(+) Enable DAC APB1 clock to get write access to DAC registers
// using RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
//(+) Configure DAC_OUT1 (DAC_OUT1: PA4) in analog mode
// using GPIO_Init() function
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//(+) Configure the DAC channel using DAC_Init()
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
//(+) Enable the DAC channel using DAC_Cmd()
DAC_Cmd(DAC_Channel_1, ENABLE);
}
我尝试了很多东西,MAX7219_SendData(MAX7219_SCANLIMIT, 0x07); SPI_I2S_SendData(SPI1, 注册); 甚至 digitalWrite(clock_pin,1);但没有任何效果。