[牛人杂谈] 使用DeepSeek学习新唐I2C

[复制链接]
1968|23
 楼主| huahuagg 发表于 2025-2-14 14:03 | 显示全部楼层 |阅读模式
I2c, eps, ps, pse, se
给DeepSeek一个新唐的官方示例
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 2 $
  5. * $Date: 15/02/06 10:22a $
  6. * @brief
  7. *           Show a Master how to access Slave.
  8. *           This sample code needs to work with I2C_Slave.
  9. * @note
  10. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  11. *
  12. ******************************************************************************/
  13. #include <stdio.h>
  14. #include "M058S.h"

  15. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  16. #define PLL_CLOCK           50000000

  17. /*---------------------------------------------------------------------------------------------------------*/
  18. /* Global variables                                                                                        */
  19. /*---------------------------------------------------------------------------------------------------------*/
  20. volatile uint8_t g_u8DeviceAddr;
  21. volatile uint8_t g_au8MstTxData[3];
  22. volatile uint8_t g_u8MstRxData;
  23. volatile uint8_t g_u8MstDataLen;
  24. volatile uint8_t g_u8MstEndFlag = 0;

  25. typedef void (*I2C_FUNC)(uint32_t u32Status);

  26. static volatile I2C_FUNC s_I2C0HandlerFn = NULL;
  27. extern char GetChar(void);

  28. /*---------------------------------------------------------------------------------------------------------*/
  29. /*  I2C0 IRQ Handler                                                                                       */
  30. /*---------------------------------------------------------------------------------------------------------*/
  31. void I2C0_IRQHandler(void)
  32. {
  33.     uint32_t u32Status;

  34.     u32Status = I2C_GET_STATUS(I2C0);

  35.     if(I2C_GET_TIMEOUT_FLAG(I2C0))
  36.     {
  37.         /* Clear I2C0 Timeout Flag */
  38.         I2C_ClearTimeoutFlag(I2C0);
  39.     }
  40.     else
  41.     {
  42.         if(s_I2C0HandlerFn != NULL)
  43.             s_I2C0HandlerFn(u32Status);
  44.     }
  45. }

  46. /*---------------------------------------------------------------------------------------------------------*/
  47. /*  I2C Rx Callback Function                                                                               */
  48. /*---------------------------------------------------------------------------------------------------------*/
  49. void I2C_MasterRx(uint32_t u32Status)
  50. {
  51.     if(u32Status == 0x08)                       /* START has been transmitted and prepare SLA+W */
  52.     {
  53.         I2C_SET_DATA(I2C0, (g_u8DeviceAddr << 1));    /* Write SLA+W to Register I2CDAT */
  54.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  55.     }
  56.     else if(u32Status == 0x18)                  /* SLA+W has been transmitted and ACK has been received */
  57.     {
  58.         I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  59.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  60.     }
  61.     else if(u32Status == 0x20)                  /* SLA+W has been transmitted and NACK has been received */
  62.     {
  63.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA_STO_SI);
  64.     }
  65.     else if(u32Status == 0x28)                  /* DATA has been transmitted and ACK has been received */
  66.     {
  67.         if(g_u8MstDataLen != 2)
  68.         {
  69.             I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  70.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  71.         }
  72.         else
  73.         {
  74.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA_SI);
  75.         }
  76.     }
  77.     else if(u32Status == 0x10)                  /* Repeat START has been transmitted and prepare SLA+R */
  78.     {
  79.         I2C_SET_DATA(I2C0, ((g_u8DeviceAddr << 1) | 0x01));   /* Write SLA+R to Register I2CDAT */
  80.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  81.     }
  82.     else if(u32Status == 0x40)                  /* SLA+R has been transmitted and ACK has been received */
  83.     {
  84.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  85.     }
  86.     else if(u32Status == 0x58)                  /* DATA has been received and NACK has been returned */
  87.     {
  88.         g_u8MstRxData = (unsigned char) I2C_GET_DATA(I2C0);
  89.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI);
  90.         g_u8MstEndFlag = 1;
  91.     }
  92.     else
  93.     {
  94.         /* TO DO */
  95.         printf("Status 0x%x is NOT processed\n", u32Status);
  96.     }
  97. }
  98. /*---------------------------------------------------------------------------------------------------------*/
  99. /*  I2C Tx Callback Function                                                                               */
  100. /*---------------------------------------------------------------------------------------------------------*/
  101. void I2C_MasterTx(uint32_t u32Status)
  102. {
  103.     if(u32Status == 0x08)                       /* START has been transmitted */
  104.     {
  105.         I2C_SET_DATA(I2C0, g_u8DeviceAddr << 1);    /* Write SLA+W to Register I2CDAT */
  106.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  107.     }
  108.     else if(u32Status == 0x18)                  /* SLA+W has been transmitted and ACK has been received */
  109.     {
  110.         I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  111.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  112.     }
  113.     else if(u32Status == 0x20)                  /* SLA+W has been transmitted and NACK has been received */
  114.     {
  115.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA_STO_SI);
  116.     }
  117.     else if(u32Status == 0x28)                  /* DATA has been transmitted and ACK has been received */
  118.     {
  119.         if(g_u8MstDataLen != 3)
  120.         {
  121.             I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]);
  122.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  123.         }
  124.         else
  125.         {
  126.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI);
  127.             g_u8MstEndFlag = 1;
  128.         }
  129.     }
  130.     else
  131.     {
  132.         /* TO DO */
  133.         printf("Status 0x%x is NOT processed\n", u32Status);
  134.     }
  135. }

  136. void SYS_Init(void)
  137. {
  138.     /*---------------------------------------------------------------------------------------------------------*/
  139.     /* Init System Clock                                                                                       */
  140.     /*---------------------------------------------------------------------------------------------------------*/

  141.     /* Enable Internal RC 22.1184MHz clock */
  142.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  143.     /* Waiting for Internal RC clock ready */
  144.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  145.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  146.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  147.     /* Enable external XTAL 12MHz clock */
  148.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  149.     /* Waiting for external XTAL clock ready */
  150.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  151.     /* Set core clock as PLL_CLOCK from PLL */
  152.     CLK_SetCoreClock(PLL_CLOCK);

  153.     /* Enable UART & I2C0 module clock */
  154.     CLK_EnableModuleClock(UART0_MODULE);
  155.     CLK_EnableModuleClock(I2C0_MODULE);

  156.     /* Select UART module clock source */
  157.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  158.     /*---------------------------------------------------------------------------------------------------------*/
  159.     /* Init I/O Multi-function                                                                                 */
  160.     /*---------------------------------------------------------------------------------------------------------*/

  161.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  162.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  163.     SYS->P3_MFP |= SYS_MFP_P30_RXD | SYS_MFP_P31_TXD;

  164.     /* Configure the SDA0 & SCL0 of I2C0 pins */
  165.     SYS->P3_MFP &= ~(SYS_MFP_P34_Msk | SYS_MFP_P35_Msk);
  166.     SYS->P3_MFP |= SYS_MFP_P34_SDA0 | SYS_MFP_P35_SCL0;
  167. }

  168. void UART0_Init()
  169. {
  170.     /*---------------------------------------------------------------------------------------------------------*/
  171.     /* Init UART                                                                                               */
  172.     /*---------------------------------------------------------------------------------------------------------*/
  173.     /* Reset IP */
  174.     SYS_ResetModule(UART0_RST);

  175.     /* Configure UART0 and set UART0 Baudrate */
  176.     UART_Open(UART0, 115200);
  177. }

  178. void I2C0_Init(void)
  179. {
  180.     /* Open I2C module and set bus clock */
  181.     I2C_Open(I2C0, 100000);

  182.     /* Get I2C0 Bus Clock */
  183.     printf("I2C clock %d Hz\n", I2C_GetBusClockFreq(I2C0));

  184.     /* Set I2C 4 Slave Addresses */
  185.     I2C_SetSlaveAddr(I2C0, 0, 0x15, 0);   /* Slave Address : 0x15 */
  186.     I2C_SetSlaveAddr(I2C0, 1, 0x35, 0);   /* Slave Address : 0x35 */
  187.     I2C_SetSlaveAddr(I2C0, 2, 0x55, 0);   /* Slave Address : 0x55 */
  188.     I2C_SetSlaveAddr(I2C0, 3, 0x75, 0);   /* Slave Address : 0x75 */

  189.     /* Enable I2C interrupt */
  190.     I2C_EnableInt(I2C0);
  191.     NVIC_EnableIRQ(I2C0_IRQn);
  192. }

  193. void I2C0_Close(void)
  194. {
  195.     /* Disable I2C0 interrupt and clear corresponding NVIC bit */
  196.     I2C_DisableInt(I2C0);
  197.     NVIC_DisableIRQ(I2C0_IRQn);

  198.     /* Disable I2C0 and close I2C0 clock */
  199.     I2C_Close(I2C0);
  200.     CLK_DisableModuleClock(I2C0_MODULE);
  201. }

  202. int32_t I2C0_Read_Write_SLAVE(uint8_t slvaddr)
  203. {
  204.     uint32_t i;

  205.     g_u8DeviceAddr = slvaddr;

  206.     for(i = 0; i < 0x100; i++)
  207.     {
  208.         g_au8MstTxData[0] = (uint8_t)((i & 0xFF00) >> 8);
  209.         g_au8MstTxData[1] = (uint8_t)(i & 0x00FF);
  210.         g_au8MstTxData[2] = (uint8_t)(g_au8MstTxData[1] + 3);

  211.         g_u8MstDataLen = 0;
  212.         g_u8MstEndFlag = 0;

  213.         /* I2C function to write data to slave */
  214.         s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  215.         /* I2C as master sends START signal */
  216.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  217.         /* Wait I2C Tx Finish */
  218.         while(g_u8MstEndFlag == 0);
  219.         g_u8MstEndFlag = 0;

  220.         /* I2C function to read data from slave */
  221.         s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterRx;

  222.         g_u8MstDataLen = 0;
  223.         g_u8DeviceAddr = slvaddr;

  224.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  225.         /* Wait I2C Rx Finish */
  226.         while(g_u8MstEndFlag == 0);

  227.         /* Compare data */
  228.         if(g_u8MstRxData != g_au8MstTxData[2])
  229.         {
  230.             printf("I2C Byte Write/Read Failed, Data 0x%x\n", g_u8MstRxData);
  231.             return -1;
  232.         }
  233.     }
  234.     printf("Master Access Slave (0x%X) Test OK\n", slvaddr);
  235.     return 0;
  236. }
  237. /*---------------------------------------------------------------------------------------------------------*/
  238. /*  Main Function                                                                                          */
  239. /*---------------------------------------------------------------------------------------------------------*/
  240. int32_t main(void)
  241. {
  242.     /* Unlock protected registers */
  243.     SYS_UnlockReg();

  244.     /* Init System, IP clock and multi-function I/O */
  245.     SYS_Init();

  246.     /* Init UART0 for printf */
  247.     UART0_Init();

  248.     /* Lock protected registers */
  249.     SYS_LockReg();

  250.     /*
  251.         This sample code sets I2C bus clock to 100kHz. Then, Master accesses Slave with Byte Write
  252.         and Byte Read operations, and check if the read data is equal to the programmed data.
  253.     */
  254.     printf("\n");
  255.     printf("+-------------------------------------------------------+\n");
  256.     printf("| I2C Driver Sample Code(Master) for access Slave       |\n");
  257.     printf("|                                                       |\n");
  258.     printf("| I2C Master (I2C0) <---> I2C Slave(I2C0)               |\n");
  259.     printf("+-------------------------------------------------------+\n");

  260.     printf("Configure I2C0 as a master.\n");
  261.     printf("The I/O connection for I2C0:\n");
  262.     printf("I2C0_SDA(P3.4), I2C0_SCL(P3.5)\n");

  263.     /* Init I2C0 */
  264.     I2C0_Init();

  265.     printf("\n");
  266.     printf("Check I2C Slave(I2C0) is running first!\n");
  267.     printf("Press any key to continue.\n");
  268.     GetChar();

  269.     /* Access Slave with no address */
  270.     printf("\n");
  271.     printf(" == No Mask Address ==\n");
  272.     I2C0_Read_Write_SLAVE(0x15);
  273.     I2C0_Read_Write_SLAVE(0x35);
  274.     I2C0_Read_Write_SLAVE(0x55);
  275.     I2C0_Read_Write_SLAVE(0x75);
  276.     printf("SLAVE Address test OK.\n");

  277.     /* Access Slave with address mask */
  278.     printf("\n");
  279.     printf(" == Mask Address ==\n");
  280.     I2C0_Read_Write_SLAVE(0x15 & ~0x01);
  281.     I2C0_Read_Write_SLAVE(0x35 & ~0x04);
  282.     I2C0_Read_Write_SLAVE(0x55 & ~0x01);
  283.     I2C0_Read_Write_SLAVE(0x75 & ~0x04);
  284.     printf("SLAVE Address Mask test OK.\n");

  285.     s_I2C0HandlerFn = NULL;

  286.     /* Close I2C0 */
  287.     I2C0_Close();

  288.     while(1);
  289. }



如何写一个函数驱动SSD1306的驱动函数

 楼主| huahuagg 发表于 2025-2-14 14:04 | 显示全部楼层
要驱动SSD1306 OLED显示屏,你需要编写一个函数来通过I2C接口与SSD1306通信。SSD1306通常使用I2C协议进行通信,并且需要发送命令和数据来控制显示屏。
以下是一个简单的函数示例,用于初始化SSD1306并通过I2C发送命令和数据。这个函数基于你提供的代码,并假设你已经正确配置了I2C0。
1. 定义SSD1306的I2C地址和命令
  1. #define SSD1306_I2C_ADDRESS 0x3C  // SSD1306的I2C地址通常是0x3C或0x3D
  2. #define SSD1306_CMD         0x00  // 命令字节
  3. #define SSD1306_DATA        0x40  // 数据字节
2. 编写发送命令和数据的函数
  1. void SSD1306_WriteCommand(uint8_t command) {
  2.     g_u8DeviceAddr = SSD1306_I2C_ADDRESS;
  3.     g_au8MstTxData[0] = SSD1306_CMD;  // 控制字节,表示发送命令
  4.     g_au8MstTxData[1] = command;      // 命令字节

  5.     g_u8MstDataLen = 0;
  6.     g_u8MstEndFlag = 0;

  7.     s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  8.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  9.     while(g_u8MstEndFlag == 0);
  10. }

  11. void SSD1306_WriteData(uint8_t data) {
  12.     g_u8DeviceAddr = SSD1306_I2C_ADDRESS;
  13.     g_au8MstTxData[0] = SSD1306_DATA;  // 控制字节,表示发送数据
  14.     g_au8MstTxData[1] = data;          // 数据字节

  15.     g_u8MstDataLen = 0;
  16.     g_u8MstEndFlag = 0;

  17.     s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  18.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  19.     while(g_u8MstEndFlag == 0);
  20. }
3. 初始化SSD1306
  1. void SSD1306_Init(void) {
  2.     // 初始化序列
  3.     SSD1306_WriteCommand(0xAE); // 关闭显示

  4.     SSD1306_WriteCommand(0xD5); // 设置显示时钟分频比/振荡器频率
  5.     SSD1306_WriteCommand(0x80);

  6.     SSD1306_WriteCommand(0xA8); // 设置多路复用率
  7.     SSD1306_WriteCommand(0x3F);

  8.     SSD1306_WriteCommand(0xD3); // 设置显示偏移
  9.     SSD1306_WriteCommand(0x00);

  10.     SSD1306_WriteCommand(0x40); // 设置显示开始行

  11.     SSD1306_WriteCommand(0x8D); // 电荷泵设置
  12.     SSD1306_WriteCommand(0x14);

  13.     SSD1306_WriteCommand(0x20); // 设置内存地址模式
  14.     SSD1306_WriteCommand(0x00); // 水平地址模式

  15.     SSD1306_WriteCommand(0xA1); // 设置段重映射
  16.     SSD1306_WriteCommand(0xC8); // 设置COM输出扫描方向

  17.     SSD1306_WriteCommand(0xDA); // 设置COM引脚硬件配置
  18.     SSD1306_WriteCommand(0x12);

  19.     SSD1306_WriteCommand(0x81); // 设置对比度控制
  20.     SSD1306_WriteCommand(0xCF);

  21.     SSD1306_WriteCommand(0xD9); // 设置预充电周期
  22.     SSD1306_WriteCommand(0xF1);

  23.     SSD1306_WriteCommand(0xDB); // 设置VCOMH取消选择级别
  24.     SSD1306_WriteCommand(0x40);

  25.     SSD1306_WriteCommand(0xA4); // 禁用整个显示开启
  26.     SSD1306_WriteCommand(0xA6); // 设置正常显示

  27.     SSD1306_WriteCommand(0xAF); // 开启显示
  28. }
4. 清屏函数
  1. void SSD1306_ClearScreen(void) {
  2.     for (uint8_t page = 0; page < 8; page++) {
  3.         SSD1306_WriteCommand(0xB0 + page); // 设置页地址
  4.         SSD1306_WriteCommand(0x00);       // 设置列地址低4位
  5.         SSD1306_WriteCommand(0x10);       // 设置列地址高4位

  6.         for (uint8_t col = 0; col < 128; col++) {
  7.             SSD1306_WriteData(0x00);      // 清除屏幕
  8.         }
  9.     }
  10. }
5. 主函数中使用SSD1306
  1. int32_t main(void) {
  2.     // 初始化系统和I2C
  3.     SYS_UnlockReg();
  4.     SYS_Init();
  5.     UART0_Init();
  6.     SYS_LockReg();

  7.     // 初始化I2C0
  8.     I2C0_Init();

  9.     // 初始化SSD1306
  10.     SSD1306_Init();

  11.     // 清屏
  12.     SSD1306_ClearScreen();

  13.     while(1) {
  14.         // 在这里可以添加其他代码来控制SSD1306显示内容
  15.     }
  16. }
6. 编译和运行
将上述代码添加到你的项目中,编译并下载到新唐M058S开发板上运行。如果一切正常,SSD1306 OLED显示屏应该会初始化并清屏。

 楼主| huahuagg 发表于 2025-2-14 14:08 | 显示全部楼层
大家说说DS写的这个发送指令和发送数据的函数,可以正常工作吗?
 楼主| huahuagg 发表于 2025-2-14 14:20 | 显示全部楼层
然后我把相关的i2c.h内容提供给它,让它再做检查,它就一直忙了,估计是它也不太懂。
 楼主| huahuagg 发表于 2025-2-14 14:44 | 显示全部楼层
(1) 改进后的 SSD1306_WriteCommand
  1. void SSD1306_WriteCommand(uint8_t command) {
  2.     g_u8DeviceAddr = SSD1306_I2C_ADDRESS << 1; // 从机地址左移一位,写模式
  3.     g_au8MstTxData[0] = SSD1306_CMD;          // 控制字节,表示发送命令
  4.     g_au8MstTxData[1] = command;              // 命令字节

  5.     g_u8MstDataLen = 0;
  6.     g_u8MstEndFlag = 0;

  7.     s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  8.     // 发送启动条件
  9.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  10.     // 等待传输完成
  11.     while (g_u8MstEndFlag == 0);
  12. }


 楼主| huahuagg 发表于 2025-2-14 14:45 | 显示全部楼层
(2) 改进后的 SSD1306_WriteData
  1. void SSD1306_WriteData(uint8_t data) {
  2.     g_u8DeviceAddr = SSD1306_I2C_ADDRESS << 1; // 从机地址左移一位,写模式
  3.     g_au8MstTxData[0] = SSD1306_DATA;         // 控制字节,表示发送数据
  4.     g_au8MstTxData[1] = data;                 // 数据字节

  5.     g_u8MstDataLen = 0;
  6.     g_u8MstEndFlag = 0;

  7.     s_I2C0HandlerFn = (I2C_FUNC)I2C_MasterTx;

  8.     // 发送启动条件
  9.     I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STA);

  10.     // 等待传输完成
  11.     while (g_u8MstEndFlag == 0);
  12. }


 楼主| huahuagg 发表于 2025-2-14 14:45 | 显示全部楼层
同时重写了I2C_MasterTx
(3) 改进后的 I2C_MasterTx 回调函数
  1. void I2C_MasterTx(uint32_t u32Status) {
  2.     if (u32Status == 0x08) { // START 条件已发送
  3.         I2C_SET_DATA(I2C0, g_u8DeviceAddr); // 发送从机地址(写模式)
  4.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  5.     } else if (u32Status == 0x18) { // 从机地址已发送,收到 ACK
  6.         I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]); // 发送数据
  7.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  8.     } else if (u32Status == 0x28) { // 数据已发送,收到 ACK
  9.         if (g_u8MstDataLen < 2) {
  10.             I2C_SET_DATA(I2C0, g_au8MstTxData[g_u8MstDataLen++]); // 发送下一个字节
  11.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
  12.         } else {
  13.             I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI); // 发送停止条件
  14.             g_u8MstEndFlag = 1; // 设置传输完成标志
  15.         }
  16.     } else {
  17.         // 处理其他状态
  18.         I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO_SI); // 发送停止条件
  19.         g_u8MstEndFlag = 1; // 设置传输完成标志
  20.     }
  21. }


蝶弄美人簪 发表于 2025-8-28 13:08 | 显示全部楼层
用 DeepSeek 查新唐芯片 I2C 手册,学寄存器配置、时序,结合例程练初始化、读写函数,调试波形验证通信,逐步掌握其 I2C 使用。
jonas222 发表于 2025-9-8 10:27 | 显示全部楼层
新唐 MCU 集成专用外设              
海边浪漫幻象 发表于 2025-9-8 15:20 | 显示全部楼层
使用 DeepSeek 学习新唐 I2C 时,可以将新唐的官方示例代码提供给 DeepSeek,让其帮助分析代码逻辑、解释函数功能等。也可以向 DeepSeek 询问 I2C 相关的基础知识、编程技巧、调试方法等,还能让其根据需求生成新的 I2C 代码片段,辅助学习和开发。
我趴在云边 发表于 2025-9-14 13:23 | 显示全部楼层
使用 DeepSeek 学习新唐 I2C 时,可将新唐官方示例代码输入 DeepSeek,让其分析代码结构与功能,如 I2C 初始化、数据传输等部分。还可询问其关于 I2C 寄存器配置、时序控制等问题,借助其代码解释和优化建议,快速掌握新唐 I2C 的开发要点。
1988020566 发表于 2025-9-17 19:25 | 显示全部楼层
实际应用中需添加超时机制,防止程序卡在while循环中。
everyrobin 发表于 2025-9-17 21:25 | 显示全部楼层
怎么计算 I²C 最高可支持的 SCL 频率?
jkl21 发表于 2025-9-17 22:41 | 显示全部楼层
检查数据手册确认 SDA/SCL 对应的 GPIO
maudlu 发表于 2025-9-18 20:28 | 显示全部楼层
I²C 模块如何初始化?              
mattlincoln 发表于 2025-9-18 21:29 | 显示全部楼层
使用逻辑分析仪验证信号边沿              
uiint 发表于 2025-9-19 11:06 | 显示全部楼层
上拉电阻匹配总线电容(一般 < 400pF)。
geraldbetty 发表于 2025-9-19 14:12 | 显示全部楼层
检查上拉电阻、波特率计算、从机地址是否正确
lzmm 发表于 2025-9-19 22:09 | 显示全部楼层
避免 SDA/SCL 线过长 ,必要时串联 33Ω 电阻抑制振铃。
nomomy 发表于 2025-9-20 09:15 | 显示全部楼层
检查从机地址、上拉电阻是否正常              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

160

主题

1437

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部