查看: 2135|回复: 3

[分享] 【i.MX RT1010体验】+GPIO模拟SPI驱动 LCD

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2021-4-8 14:00:50 | 显示全部楼层 |阅读模式
    本帖最后由 胤幻1988 于 2021-4-8 14:02 编辑

    今天又捣鼓了半天,我决定不再捣鼓外接什么模块了,就用它本身自带的好了。搞的我好累,想引出个LPSPI1就这么难么?
    板上虽说可以去掉电阻,切断跟其他外设的连线,但是电阻太小又密集。而且这板可能别人还要用。
    就不弄了,不跳线,不去电阻,先这样弄弄吧。
    由于ardunio引出的LPSPI接口,完全连接到外置FLASH上,硬件SPI不成功。
    写了好几个代码,一直不成功,差点自闭了。库不行,就用寄存器,还是不行。我也不再深究了。
    AA3.png
    AA4.png

    硬件LPSPI配置:
    AA7.png

    1. CLOCK_SetMux(kCLOCK_LpspiMux, 1U);
    2.     CLOCK_SetDiv(kCLOCK_LpspiDiv, 7U);

    3.     uint32_t srcClock_Hz;

    4.         lpspi_master_config_t masterConfig;


    5. //Master config
    6. LPSPI_MasterGetDefaultConfig(&masterConfig);
    7.         masterConfig.baudRate = 500000U;
    8.         masterConfig.bitsPerFrame = 8;
    9.         masterConfig.whichPcs = kLPSPI_Pcs0;
    10.         masterConfig.cpol=kLPSPI_ClockPolarityActiveHigh;
    11.         masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge; // CPHA=0
    12.         masterConfig.direction = kLPSPI_MsbFirst;

    13.         masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate * 2;
    14.         masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate * 2;
    15.         masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate * 2;
    16.         masterConfig.whichPcs = kLPSPI_Pcs0;
    17.         masterConfig.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;
    18.         masterConfig.pinCfg = kLPSPI_SdiInSdoOut;
    19.         masterConfig.dataOutConfig = kLpspiDataOutRetained;



    20.         srcClock_Hz = (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (7U + 1U));
    21.         LPSPI_MasterInit(LPSPI1, &masterConfig, srcClock_Hz);
    22.         LPSPI_Enable(LPSPI1,true);*/
    复制代码
    硬件SPI读写单个字节:
    1. uint8_t TXDummy;
    2.         uint16_t retry=0;
    3.         LPSPI_WriteData(LPSPI1,data);
    4.         //while ((LPSPI_GetStatusFlags(LPSPI1)>>24)&0x01 == 1)//检测是否BUSY
    5.         while ((LPSPI_GetStatusFlags(LPSPI1)>>10)&0x01 == 1)//传输完成
    6.         {
    7.                         retry++;
    8.                         if(retry>=1000)
    9.                                         return 0;
    10.         }
    11.         TXDummy=LPSPI_ReadData(LPSPI1);//¶áè¡êy¾Y Çå¿ÕFIFO
    12.         return TXDummy;
    复制代码
    1. while (((LPSPI1->SR & LPSPI_SR_TDF_MASK) >> LPSPI_SR_TDF_SHIFT) == 0);
    2.                         LPSPI1->TDR = data;

    3.                         LCD_SPI->TCR =
    4.                                                  (LCD_SPI->TCR & ~(LPSPI_TCR_CONT_MASK | LPSPI_TCR_CONTC_MASK | LPSPI_TCR_RXMSK_MASK | LPSPI_TCR_PCS_MASK)) |
    5.                                                  LPSPI_TCR_CONT(1) | LPSPI_TCR_CONTC(0) | LPSPI_TCR_RXMSK(0) | LPSPI_TCR_PCS(0);


    6.                         LPSPI1->TCR = ((LPSPI1->TCR) | (LPSPI_TCR_TXMSK_MASK)); //<! Start Transmit Hardware Clear
    7.                         LPSPI1->TCR = ((LPSPI1->TCR) & (~LPSPI_TCR_RXMSK_MASK));
    8.                         LPSPI1->SR  = LPSPI_SR_TDF_MASK; //<! Clear TDF flag
    9.                         LCD_SPI->TCR = (LCD_SPI->TCR & ~(LPSPI_TCR_CONTC_MASK));

    10.                         while (((LPSPI1->SR & LPSPI_SR_RDF_MASK) >> LPSPI_SR_RDF_SHIFT) == 0);
    11.                         temp= LPSPI1->RDR;
    12.                         LPSPI1->SR = LPSPI_SR_RDF_MASK; //<! Clear RDF flag
    复制代码
    模拟SPI:
    AA6.png
    1. #define LCD_CS_SET()             GPIO_PinWrite(BOARD_INITPINS_lcd_cs_PERIPHERAL,  BOARD_INITPINS_lcd_cs_CHANNEL,  1u)    /* LCD spi select set high */
    2. #define LCD_CS_CLR()             GPIO_PinWrite(BOARD_INITPINS_lcd_cs_PERIPHERAL,  BOARD_INITPINS_lcd_cs_CHANNEL,  0u)    /* LCD spi select set low */

    3. #define LCD_DC_SET()             GPIO_PinWrite(BOARD_INITPINS_lcd_dc_PERIPHERAL,  BOARD_INITPINS_lcd_dc_CHANNEL,  1u)    /* LCD command set high */
    4. #define LCD_DC_CLR()             GPIO_PinWrite(BOARD_INITPINS_lcd_dc_PERIPHERAL,  BOARD_INITPINS_lcd_dc_CHANNEL,  0u)    /* LCD command set low */

    5. #define LCD_RST_SET()            GPIO_PinWrite(BOARD_INITPINS_lcd_rst_PERIPHERAL, BOARD_INITPINS_lcd_rst_CHANNEL, 1u)    /* LCD reset set high */
    6. #define LCD_RST_CLR()            GPIO_PinWrite(BOARD_INITPINS_lcd_rst_PERIPHERAL, BOARD_INITPINS_lcd_rst_CHANNEL, 0u)    /* LCD reset set low */

    7. #define LCD_SCK_SET()            GPIO_PinWrite(BOARD_INITPINS_lcd_sck_PERIPHERAL, BOARD_INITPINS_lcd_sck_CHANNEL, 1u)    /* LCD reset set high */
    8. #define LCD_SCK_CLR()            GPIO_PinWrite(BOARD_INITPINS_lcd_sck_PERIPHERAL, BOARD_INITPINS_lcd_sck_CHANNEL, 0u)

    9. #define LCD_SDO_SET()            GPIO_PinWrite(BOARD_INITPINS_lcd_sdo_PERIPHERAL, BOARD_INITPINS_lcd_sdo_CHANNEL, 1u)    /* LCD reset set high */
    10. #define LCD_SDO_CLR()            GPIO_PinWrite(BOARD_INITPINS_lcd_sdo_PERIPHERAL, BOARD_INITPINS_lcd_sdo_CHANNEL, 0u)
    复制代码
    复制代码
    1. uint8_t i;

    2.         for(i=0;i<8;i++)
    3.         {
    4.                 LCD_SCK_CLR();
    5.                 if(data&0x80)
    6.                         LCD_SDO_SET();
    7.                 else
    8.                         LCD_SDO_CLR();
    9.                 LCD_SCK_SET();
    10.                 data<<=1;
    11.         }

    12.     return 0;
    复制代码



    其余操作LCD的函数,就没什么好说的了。
    aa8.jpg





    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-4-8 14:52:34 | 显示全部楼层
    楼主要坚持

    看来被浓缩的实在有些厉害啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    注册会员

    Rank: 2

    积分
    121
    最后登录
    2022-10-30
    发表于 2021-11-22 23:18:42 | 显示全部楼层
    老哥我也是快被LPSPI搞自闭了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    72

    帖子

    0

    注册会员

    Rank: 2

    积分
    78
    最后登录
    2023-1-28
    发表于 2022-11-6 21:39:53 | 显示全部楼层
    本帖最后由 kwcha333 于 2023-1-1 14:42 编辑

    感谢分享
















    清洗分體式冷氣機收費
    室外機在下雨時會被雨水沖洗,這樣就能把附在室外機上的灰塵沖洗,因此客戶對於清洗室外機的需求會較少

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 16:31 , Processed in 0.123697 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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