OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4921|回复: 3

STM32当把SPI1外设Remap时,PA15无法设置成SPI的NSS信号输出?

[复制链接]

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7344
金钱
7344
注册时间
2016-2-6
在线时间
1863 小时
发表于 2016-6-12 00:20:13 | 显示全部楼层 |阅读模式
我在设计一个case的时候,为了布线方便把OLED显示屏(SSD1309驱动)连接到SPI1的remap管脚上了。软件调试时,发现无论采用什么类型的SPI配置模式都无法驱动显示屏正常显示,情急之下采用软件模拟SPI时序进行控制,没想到竟然可以成功驱动。看来问题的本身还是在SPI接口上。回到原点从新开始测试SPI配置模式,在将NCS配置成软件控制模式后,由软件控制从设备片选信号的置位与复位时成功了。由此看出,当PA15作为SPI1的remap引脚使用时,其不能完成由SPI1的硬件控制实现对从设备的选通功能。不知道大家有没有遇到这样的问题,也不知其它外设remap时是不是也存在这样的问题。给大家提个醒,下次遇到这样的事情还是要多试试各种模式,不要尽信数据手册上说的内容。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7344
金钱
7344
注册时间
2016-2-6
在线时间
1863 小时
 楼主| 发表于 2016-6-12 00:22:05 | 显示全部楼层
顺便贴一段SSD1309驱动的OLED驱动程序,我在网上找了好长时间都没有找到可以使用的,希望对大家有帮助。
void SSD1309_IO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStruct.GPIO_Pin =GPIO_Pin_3 |GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Pin =GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        GPIO_SetBits(GPIOA, GPIO_Pin_15);

        GPIO_InitStruct.GPIO_Pin =CMD_DATA_SEL_PIN;
        GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_SetBits(GPIOB, CMD_DATA_SEL_PIN);
}

void SSD1309_SPI_Configuration(void)
{
        SPI_InitTypeDef SPI_InitStruct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
       
        SPI_I2S_DeInit(SPI1);
        SPI_InitStruct.SPI_Direction =SPI_Direction_1Line_Tx;
        SPI_InitStruct.SPI_Mode =SPI_Mode_Master;
        SPI_InitStruct.SPI_DataSize =SPI_DataSize_8b;
        SPI_InitStruct.SPI_CPOL =SPI_CPOL_High;                                                                //′®DDí¬2½ê±ÖóμÄ¿ÕÏD×′ì¬Îa¸ßμçÆ½
        SPI_InitStruct.SPI_CPHA =SPI_CPHA_2Edge;                                                        //μú¶t¸öìø±äÑØêy¾Y±»2é¼ˉ
        SPI_InitStruct.SPI_NSS =SPI_NSS_Soft;
        SPI_InitStruct.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_32;
        SPI_InitStruct.SPI_FirstBit =SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_CRCPolynomial =7;
        SPI_Init(SPI1, &SPI_InitStruct);

        SPI_Cmd(SPI1, ENABLE);
}

void SSD1309_ByteSend(uint8_t uCmdOrData, uint8_t uData)
{
        if(uCmdOrData ==OLED_COMMAND)
                SEND_OLED_CMD();
        else
                SEND_OLED_DATA();
        GPIO_ResetBits(GPIOA, GPIO_Pin_15);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ==RESET)
                ;
        SPI_I2S_SendData(SPI1, uData);
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) !=RESET)
                ;
        GPIO_SetBits(GPIOA, GPIO_Pin_15);
}

void OLED_Address(uint8_t uPage, uint8_t uData)
{
        SSD1309_ByteSend(OLED_COMMAND, uPage +0xb0);
        SSD1309_ByteSend(OLED_COMMAND, ((uData >>4) &0x0f) +0x10);
        SSD1309_ByteSend(OLED_COMMAND, uData &0x0f);
}

void OLED_FullDisp(uint16_t uData16)
{
        uint8_t i, j;
       
        for(i =0; i <8; i++)
        {
                OLED_Address(i, 0);
                for(j =0; j <64; j++)
                {
                        SSD1309_ByteSend(OLED_DATA, (uData16 >>8) &0x00ff);
                        SSD1309_ByteSend(OLED_DATA, uData16 &0x00ff);
                }
        }
}

void OLED_DisplayFullPicture(uint8_t *uPtr)
{
        uint8_t i, j;
       
        for(i =0; i <8; i++)
        {
                OLED_Address(i, 0);
                for(j =0; j <128; j++, uPtr++)
                        SSD1309_ByteSend(OLED_DATA, *uPtr);
        }
}

void OLED_16x16CharDisplay(uint8_t uPage, uint8_t uColumn, uint8_t *uPtr)
{
        uint8_t i, j;
       
        for(i =0; i <2; i++)
        {
                OLED_Address(uPage +i, uColumn);
                for(j =0; j <16; j++, uPtr++)
                        SSD1309_ByteSend(OLED_DATA, *uPtr);
        }
}

void OLED_12x12CharDisplay(uint8_t uPage, uint8_t uColumn, uint8_t *uPtr)
{
        uint8_t i, j;
       
        for(i =0; i <2; i++)
        {
                OLED_Address(uPage +i, uColumn);
                for(j =0; j <12; j++, uPtr++)
                        SSD1309_ByteSend(OLED_DATA, *uPtr);
        }
}

void StartMenu(void)
{
        uint8_t i;
        uint8_t *uPtr;
       
        for(i =0, uPtr =ChineseChar[0]; i <8; i++, uPtr +=32)
                OLED_16x16CharDisplay(2, i *16, uPtr);
       
        for(i =0, uPtr =UnitChar[0]; i <8; i++, uPtr +=24)
                OLED_12x12CharDisplay(5, i *12 +16, uPtr);
}

void OLED_Initial(void)
{
        SSD1309_IO_Init();
        SSD1309_SPI_Configuration();
       
        SSD1309_ByteSend(OLED_COMMAND, OLED_DISPLAY_OFF);
       
        SSD1309_ByteSend(OLED_COMMAND, 0xd5);                                                //éè&#214;&#195;OLED&#196;£&#191;é&#190;§&#213;&#241;&#198;μ&#194;ê
        SSD1309_ByteSend(OLED_COMMAND, 0x70);
       
        SSD1309_ByteSend(OLED_COMMAND, 0x8d);                                                //&#212;êDíéy&#209;1
        SSD1309_ByteSend(OLED_COMMAND, 0x14);
       
        SSD1309_ByteSend(OLED_COMMAND, 0x81);                                                //&#182;&#212;±è&#182;è&#206;¢μ÷£&#172;′&#203;êy&#190;Y0x812&#187;&#184;&#196;±&#228;£&#172;&#189;&#246;&#184;&#196;±&#228;&#207;&#194;&#195;&#230;μ&#196;êy&#214;μ
        SSD1309_ByteSend(OLED_COMMAND, 0x80);                                                //&#182;&#212;±è&#182;è&#206;¢μ÷êy&#214;μ£&#172;0x00-0xff
       
        SSD1309_ByteSend(OLED_COMMAND, 0xa6);                                                //éè&#214;&#195;&#206;a&#213;y3£&#207;&#212;ê&#190;
        SSD1309_ByteSend(OLED_COMMAND, 0xa4);                                                //&#207;&#212;ê&#190;&#206;a3£1&#230;&#207;&#212;ê&#190;
       
        SSD1309_ByteSend(OLED_COMMAND, 0xa8);                                                //éè&#214;&#195;Duty
        SSD1309_ByteSend(OLED_COMMAND, 0x3f);                                                //Duty =1/64
       
        SSD1309_ByteSend(OLED_COMMAND, 0xd3);                                                //éè&#214;&#195;&#198;&#171;ò&#198;
        SSD1309_ByteSend(OLED_COMMAND, 0x00);
       
        SSD1309_ByteSend(OLED_COMMAND, 0x20);                                                //ò3&#209;°&#214;·&#196;£ê&#189;
        SSD1309_ByteSend(OLED_COMMAND, 0x02);
       
        SSD1309_ByteSend(OLED_COMMAND, 0xc8);                                                //DDé¨&#195;è£o′óé&#207;&#214;á&#207;&#194;
        SSD1309_ByteSend(OLED_COMMAND, 0xa1);                                                //áDé¨&#195;è£o′ó×ó&#214;áóò
       
        SSD1309_ByteSend(OLED_COMMAND, 0xda);                                                //&#203;3Dòéè&#214;&#195;
        SSD1309_ByteSend(OLED_COMMAND, 0x12);
       
        SSD1309_ByteSend(OLED_COMMAND, 0xd9);                                                //éè&#214;&#195;&#212;¤3&#228;μ&#231;&#214;ü&#198;ú
        SSD1309_ByteSend(OLED_COMMAND, 0x22);
       
        SSD1309_ByteSend(OLED_COMMAND, 0xdb);                                                //éè&#214;&#195;VCOMH&#214;μ
        SSD1309_ByteSend(OLED_COMMAND, 0x3c);
       
        SSD1309_ByteSend(OLED_COMMAND, OLED_DISPLAY_ON);
       
        SSD1309_ByteSend(OLED_COMMAND, 0x40);                                                //éè&#214;&#195;&#198;eê&#188;DD
       
        OLED_ScreenClear();
        StartMenu();
}
回复 支持 反对

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-6-12 11:46:41 | 显示全部楼层
PA15是JTAG引脚,不知道你关了jtag没有
回复 支持 反对

使用道具 举报

3

主题

144

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7344
金钱
7344
注册时间
2016-2-6
在线时间
1863 小时
 楼主| 发表于 2016-6-12 16:43:30 | 显示全部楼层
肯定关掉了的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 04:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表