楼主: NXP管管

[在线活动] 【送70块板卡】“中秋芯礼”开发板大放送

  [复制链接]
回帖奖励 27 NXP金币 回复本帖可获得 3 NXP金币奖励! 每人限 2 次
抢楼 抢楼 查看抢中楼层 本帖为抢楼帖,欢迎抢楼!  奖励楼层: 7,77,177 
  • TA的每日心情
    擦汗
    前天 10:23
  • 签到天数: 2096 天

    连续签到: 2 天

    [LV.Master]伴坛终老

    65

    主题

    8413

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    14222
    最后登录
    2025-8-1
    发表于 2024-9-20 13:45:06 | 显示全部楼层
    有个产品里有4-20MA输出的,在家里用电流表,负载都分别测试过了,没问题。到客户手中测试始终出不来最大值20MA,代码各种修正,折腾好几天死活搞不定,后来发现是硬件电路带载能力不够,带好点的万用表和负载可以,差点的万用表就不行了,万用表的内阻有差异,我们的硬件带载能力不是很大。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 1503 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4691

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10088
    最后登录
    2025-7-29
    发表于 2024-9-20 15:08:25 | 显示全部楼层

    回帖奖励 +3 NXP金币


    谢谢
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:31
  • 签到天数: 1106 天

    连续签到: 24 天

    [LV.10]以坛为家III

    28

    主题

    4280

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5804
    最后登录
    2025-8-1
    发表于 2024-9-21 10:59:19 | 显示全部楼层
    一个用Arduino测试GXHT30温湿度传感器的例程:
    #include <Wire.h>

    // SHT30 IIC 7位地址为0x44
    #define Addr_SHT30 0x44

    // 使用WeMos D1 Mini开发板 兼容ESP8266开发板 IIC方式
    #define SDA_PIN 4   //引脚接法在这里    SDA引脚  接在D2
    #define SCL_PIN 5   // SCL引脚                  接在D1   

    void setup()
    {
      //初始化IIC(作为主设备)
      Wire.begin(SDA_PIN, SCL_PIN);
    //  Wire.begin();   //如果12行报错就改为这个,接线接到你单片机的默认口
      //初始化串行通信,设置波特率=9600
      Serial.begin(115200);

      //延时以求稳定(删了也没事)
      delay(300);
    }

    void loop()
    {
      unsigned int data[6]; //存储获取到的六个数据
      //开始IIC
      //写地址
      Wire.beginTransmission(Addr_SHT30);
      //发送测量命令 0x2C06,但是因为IIC一次只能发一个8位数据,所以得发两次
      Wire.write(0x2C);
      Wire.write(0x06);
      //停止IIC
      Wire.endTransmission();
      //等待500ms是等待SHT30器件测量数据,实际上这个时间可以很短
      delay(500);

      //请求获取6字节的数据,然后会存到8266的内存里
      Wire.requestFrom(Addr_SHT30, 6);

      //读取6字节的数据
      //这六个字节分别为:温度8位高数据,温度8位低数据,温度8位CRC校验数据
      //               湿度8位高数据,湿度8位低数据,湿度8位CRC校验数据
      if (Wire.available() == 6)
      {
        data[0] = Wire.read();
        data[1] = Wire.read();
        data[2] = Wire.read();
        data[3] = Wire.read();
        data[4] = Wire.read();
        data[5] = Wire.read();
      }

      //然后计算得到的数据,要转化为摄氏度、华氏度、相对湿度
      float cTemp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45;
      float fTemp = (cTemp * 1.8) + 32;
      float humidity = ((((data[3] * 256.0) + data[4]) * 100) / 65535.0);

      //在串口里输出得到的数据
      Serial.print("XiangDuiShiDu:");
      Serial.print(humidity);
      Serial.println(" %RH");
      Serial.print("SheSHiWenDu:");
      Serial.print(cTemp);
      Serial.println(" C");
      Serial.print("HuashiWenDU:");
      Serial.print(fTemp);
      Serial.println(" F");
      
      Serial.print("YuanshiShujU:");
      Serial.print(data[0],HEX);
      Serial.print(data[1],HEX);
      Serial.println(data[2],HEX);
      Serial.print(data[3],HEX);
      Serial.print(data[4],HEX);
      Serial.println(data[5],HEX);
      
      delay(500);
    }

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

    使用道具 举报

    94#
    无效楼层,该帖已经被删除
    95#
    无效楼层,该帖已经被删除
  • TA的每日心情
    开心
    2024-9-29 09:02
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    0

    主题

    29

    帖子

    0

    注册会员

    Rank: 2

    积分
    108
    最后登录
    2024-9-29
    发表于 2024-9-21 19:38:32 来自手机 | 显示全部楼层
    开始玩freertos的时候,用了多任务,发现开发板老是重启,后来翻阅资料才知道freertos任务在结束的时候要进行自释放。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:31
  • 签到天数: 1106 天

    连续签到: 24 天

    [LV.10]以坛为家III

    28

    主题

    4280

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5804
    最后登录
    2025-8-1
    发表于 2024-9-22 20:08:36 | 显示全部楼层
    51单片机,IIC方式驱动LCD1602
    /**
    * IIC方式驱动LCD1602
    * 使用IAP15W4K58S4
    *************************************************************************************
    * LCD1602模块:  VCC  - 5V
    *  (PFC8547)     GND
    *                SCL - P3.2
    *                SDA - P3.3
    *=================================
    * PCF8574T              LCD1602
    *---------------------------------
    * P7                  DB7
    * P6                  DB6
    * P5                  DB5
    * P4                  DB4
    * P3             控制背光灯
    * P0                  RS
    * P1                  RW
    * P2                  CS
    *================================================================================
    * LCD1602的操作
    * 写指令: RS=0, RW=0, CS(E)上升沿
    * 写数据: RS=1, RW=0, CS(E)上升沿
    *================================================================================
    * LCD1602的操作指令
    * Bit                   RS  RW   7   6   5   4   3   2   1   0                  
    *-----------------------------------------------------------------------------------
    *  1.清除显示            0   0   0   0   0   0   0   0   0   1
    *  2.光标返回            0   0   0   0   0   0   0   0   1   *
    *  3.设输入模式          0   0   0   0   0   0   0   1   I/D S     I/D:光标移动方向,1-右移;0-左移
    *                                                                 S:屏幕上所有文字是否左移或右移,1表示有效,0表示无效
    *  4.显示开关            0   0   0   0   0   0   1   D   C   B     D=1开显示,D=0关显示
    *                                                                 C=1显示光标,C=0关闭光标
    *                                                                 B=1光标闪烁,B=0光标不闪烁
    *  5.光标字符移位        0   0   0   0   0   1   S/C R/L *   *     S/C 1-显示移动的文字,0-移动光标
    *                                                                  R/L 左右方向
    *  6.设置功能            0   0   0   0   1   DL  N   F   *   *     DL: 1-4位总线;0-8位总线
    *                                                                  N:  1-双行显示;0-单行显示
    *                                                                  F:  1-5X10点阵, 0-5x7点阵
    *  7.设置字符发生器地址  0   0   0   1   字符发生器RAM           
    *  8.设置数据存储器地址  0   0   1   显示数据存储器地址
    *-----------------------------------------------------------------------------------
    *  9.读忙标志或地址      0   1   BF  计数器地址
    * 10.写数到CGRAM或DDRAM  1   0   要写的数据内容
    * 11.从CGRAM或DDRAM读    1   1   读出的数据
    *===================================================================================
    * 数据指针设置             80H + 地址码(0-27H(第一行),40H-67H(第二行))
    ** LCD1602 四线驱动方式下,一个字节数据传输2回
    **/
    *
    */

    #include "stc15.h"
    #include "string.h"

    sbit SCL=P3^2;
    sbit SDA=P3^3;
    void delay_ms(unsigned int ms);                                                                                                       
    void delay_10us(unsigned int i);
    /**********I2C init***********/
    void I2cStart(void);
    void I2cStop(void);
    unsigned char I2cSendByte(unsigned char dat);
    void send_pfc8574Byte(unsigned char dat);
    void write_lcd1602_cmd(unsigned char cmd);
    void write_lcd1602_data(unsigned char dat);
    void lcd_init(void);
    void write_cmd(unsigned char cmd);
    void write_data(unsigned char DData);
    void dispaly(unsigned char X, unsigned char Y, unsigned char DData);
    void dispaly_character(unsigned char X, unsigned char Y, unsigned char* Arry);
    void lcd1602_write_str(unsigned char addr, unsigned char num, unsigned char *dat);
    //Y为显示指针的位置,即为各行的第几个位置,X选行
    //col:0-15
    //row:0-1
    void lcd1602_GotoXY(unsigned char row, unsigned char col);
    //向LCD写入字符串
    void LCD1602_Display_NoXY(unsigned char *str);

    unsigned char code arry[]="successfully!";

    // 读写IIC显示板的地址
    #define LCD_ADDR_W 0x4E
    #define LCD_ADDR_R 0x4F

    // 毫秒级延时
    void delay_ms(unsigned int ms) {
        unsigned int i,j;
        for(j=0;j<ms;j++)
            for(i=0;i<1000;i++);
    }

    // 1o微秒单位的延时
    void delay_10us(unsigned int i) {
            unsigned char a,b,c;
            for(c=0;c<i;c++) {
                    for(b=1;b>0;b--) {
                            for(a=2;a>0;a--);
                    }
            }
    }

    // 开始信号
    void I2cStart(void) {
            SDA=1;
            delay_10us(5);
            SCL=1;
            delay_10us(5);
            SDA=0;
            delay_10us(5);
            SCL=0;                       
            delay_10us(5);               
    }

    // 停止信号
    void I2cStop(void) {
            SDA=0;
            delay_10us(5);
            SCL=1;
            delay_10us(5);
            SDA=1;
            delay_10us(5);               
    }

    // MCU模拟IIC方式发出一字节
    unsigned char I2cSendByte(unsigned char dat) {
        unsigned char a=0,b=0;
       
            for(a=0;a<8;a++) {
                    SDA=dat>>7;         
                    dat=dat<<1;
                    delay_10us(5);
                    SCL=1;
                    delay_10us(5);
                    SCL=0;
                    delay_10us(5);
            }

        // 等待ACK
            SDA=1;
        // 等待从机使ACK=0
            delay_10us(5);
            SCL=1;
        delay_10us(5);
        // 等待SDA=0
            while(SDA) {
                    b++;
                    if(b>200) {
                            SCL=0;
                            delay_10us(5);
                // 超时
                            return 0;
                    }
            }
        // 收到SDA=0
            SCL=0;
            delay_10us(5);
            return 1;               
    }


    // 发送一个字节给pfc8574
    // 发送给LCD1602,要通过pfc8574实现,类似于74HC164那种串并转换处理
    void send_pfc8574Byte(unsigned char dat, unsigned char cdmode) {
        I2cStart();
        I2cSendByte(LCD_ADDR_W);     // 写器件的物理地址,是给pfc8574t的,不是转给LCD1602的,不许要发两次
        // 发送匹配LCD1602用的数据(含指令),要发两次,一个字节拆成2个4位,移到P7 P6 P5 P4这四位上   
        I2cSendByte(dat);
        I2cStop();
    }

    // 向LCD1602发送指令
    void write_lcd1602_cmd(unsigned char cmd) {
        unsigned char cmd1, cmd2;
        cmd1=cmd|0x0f;
       
        send_pfc8574Byte(cmd1 & 0xfc);    // 11111100 : CS=1,RW=0, RS=0
        delay_10us(1);
        send_pfc8574Byte(cmd1 & 0xf8);    // 11111100 : CS=0,RW=0, RS=0
       
        cmd2=cmd<<4;
        cmd2=cmd2|0x0f;
        send_pfc8574Byte(cmd2 & 0xfc);    // 11111100 : CS=1,RW=0, RS=0
        delay_10us(1);
        send_pfc8574Byte(cmd2 & 0xf8);    // 11111100 : CS=0,RW=0, RS=0
    }

    // 向LCD1602发送数据
    void write_lcd1602_data(unsigned char dat) {
        unsigned char dat1, dat2;
        dat1=dat|0x0f;
       
        send_pfc8574Byte(dat1 & 0xfd);    // 11111100 : CS=1,RW=0, RS=1
        delay_10us(1);
        send_pfc8574Byte(dat1 & 0xf9);    // 11111100 : CS=0,RW=0, RS=1
       
        dat2=dat<<4;
        dat2=dat2|0x0f;
        send_pfc8574Byte(dat2 & 0xfd);    // 11111100 : CS=1,RW=0, RS=1
        delay_10us(1);
        send_pfc8574Byte(dat2 & 0xf9);    // 11111100 : CS=0,RW=0, RS=1
    }

    // 初始化
    void lcd_init(void) {
        write_lcd1602_cmd(0x33);    // 设置显示 4 (0x38:8)
        write_lcd1602_cmd(0x32);    // 设置4线控制
        write_lcd1602_cmd(0x28);    // 设置16*2, 5*7, 4线初始化
        write_lcd1602_cmd(0x06);    // 地址加1,数据不一定,地址移动
        write_lcd1602_cmd(0x0C);    // 不显示光标,光标不闪烁
        //write_lcd1602_cmd(0x0f);    //  显示光标,光标闪烁
        write_lcd1602_cmd(0x01);    // 清屏
        write_lcd1602_cmd(0x80);    // 起始地址
        delay_ms(5);
    }

    // 使LCD1602显示字符串
    void lcd1602_write_str(unsigned char addr, unsigned char num, unsigned char *dat) {
        unsigned char i;
        write_lcd1602_cmd(addr);
        for (i=0;i<num; i++) {
            write_lcd1602_data(*dat++);
        }
    }

    //Y为显示指针的位置,即为各行的第几个位置,X选行
    //col:0-15
    //row:0-1
    void lcd1602_GotoXY(unsigned char row, unsigned char col) {
        if(row == 0)
            write_lcd1602_cmd(0x80 + col);
        if(row == 1)
            write_lcd1602_cmd(0x80 + 0x40 + col);
    }
    //向LCD写入字符串
    void LCD1602_Display_NoXY(unsigned char *str) {
        while(*str != '\0') {
            write_lcd1602_data(*str);
            str++;
        }
    }


    int main() {
        // 初始化LCD1602
            lcd_init();
        // 循环显示固定内容,仅仅是为了测试
            while(1) {
            // 定位显示位置为第一行、第一列
            lcd1602_GotoXY(0,0);
            write_lcd1602_data('B');
            
            // 定位显示位置为第二行、第一列
            lcd1602_GotoXY(1,0);
            LCD1602_Display_NoXY(arry);
            delay_ms(10);
            }
    }
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-29 09:02
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    0

    主题

    29

    帖子

    0

    注册会员

    Rank: 2

    积分
    108
    最后登录
    2024-9-29
    发表于 2024-9-22 22:47:37 来自手机 | 显示全部楼层
    树莓派PICO的PIO算是很好的设计吧,应用广泛。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:15
  • 签到天数: 534 天

    连续签到: 29 天

    [LV.9]以坛为家II

    21

    主题

    863

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2339
    最后登录
    2025-8-2
    发表于 2024-9-23 07:20:22 | 显示全部楼层

    回帖奖励 +3 NXP金币

    最近新板子的外设都升级I2c为I3C了,我想找一块开发板学习一下I3C的新功能,并分享心得!
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    前天 10:23
  • 签到天数: 2096 天

    连续签到: 2 天

    [LV.Master]伴坛终老

    65

    主题

    8413

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    14222
    最后登录
    2025-8-1
    发表于 2024-9-23 08:46:30 | 显示全部楼层
    OLED显示立方体旋转

    from math import cos,sin,pi

    cube=[[-15,-15,-15],[-15,15,-15],[15,15,-15],[15,-15,-15],[-15,-15,15],[-15,15,15],[15,15,15],[15,-15,15]]
    lineid=[1,2,2,3,3,4,4,1,5,6,6,7,7,8,8,5,8,4,7,3,6,2,5,1]

    def matconv(a,matrix):
        res=[0,0,0]
        for i in range(0,3):
            res[i]=matrix[i][0]*a[0]+matrix[i][1]*a[1]+matrix[i][2]*a[2]
        for i in range(0,3):
            a[i]=res[i]
        return a

    def rotate(obj,x,y,z):
        x=x/pi
        y=y/pi
        z=z/pi
        rz=[[cos(z),-sin(z),0],[sin(z),cos(z),0],[0,0,1]]
        ry=[[1,0,0],[0,cos(y),-sin(y)],[0,sin(y),cos(y)]]
        rx=[[cos(x),0,sin(x)],[0,1,0],[-sin(x),0,cos(x)]]
        matconv(matconv(matconv(obj,rz),ry),rx)
       
    def drawcube(x,y,z):
        oled.fill(0)
        for i in range(0,8):
            rotate(cube[i],x,y,z)
        for i in range(0,24,2):
            x1=int(64+cube[lineid[i]-1][0])
            y1=int(32+cube[lineid[i]-1][1])
            x2=int(64+cube[lineid[i+1]-1][0])
            y2=int(32+cube[lineid[i+1]-1][1])
            oled.line(x1,y1,x2,y2,1)
            #print(64+cube[lineid[i]-1][0],32+cube[lineid[i]-1][1],64+cube[lineid[i+1]-1][0],32+cube[lineid[i+1]-1][1])
        oled.show()
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-3 03:52 , Processed in 0.098245 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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