Faits:
A. Par jugement du 21 avril 2009 - sur opposition à une ordonnance pénale rendue par le Juge d'instruction -, le Juge de police de l'arrondissement de la Sarine a condamné A._ à sept jours-amende à 10 fr. et à 200 fr. d'amende pour infractions à la LCR et contravention à la LStup.
A._ a formé appel, par acte du 1er juillet 2009, auprès de la Cour d'appel pénal du Tribunal cantonal fribourgeois. Dans sa réponse au recours, le Ministère public, agissant par le Substitut du Procureur B._, a conclu à l'irrecevabilité de l'appel pour motivation insuffisante. Dans ses observations complémentaires du 11 septembre 2009, A._ a requis la récusation du Substitut, en faisant valoir que ce dernier, qu'il connaissait depuis longtemps, lui avait donné des cours de droit dans un collège privé, et aurait été licencié "un peu à cause de [lui]", A._ ayant mis en doute ses compétences. Le Substitut aurait aussi déclaré à un inspecteur qu'il "voulait [sa] peau et celle de [son] frère". Le Substitut s'est déterminé sur cette demande de récusation en relevant qu'il agissait en tant que partie à la procédure, qu'il ne s'était déterminé que sur la recevabilité du recours, qu'il ne se souvenait que vaguement du recourant, qu'il n'avait pas connu de problèmes relationnels avec ses étudiants et qu'il n'avait pas été licencié. Les autres allégués relevaient de la calomnie, et leur auteur était invité à les retirer dans les trente jours, faute de quoi le dépôt d'une plainte pénale serait envisagé.
B. Par arrêt du 3 novembre 2009, la Chambre pénale du Tribunal cantonal, compétente en la matière, a rejeté la demande de récusation. Les art. 29, 30 Cst. et 6 CEDH n'exigeaient pas la récusation d'un magistrat intervenant comme partie au procès, se bornant à soutenir l'accusation et à conclure à l'irrecevabilité du recours. Compte tenu de l'attitude de l'inculpé durant la procédure, les faits invoqués dans la demande de récusation n'étaient pas crédibles
C. Par acte du 23 novembre 2009, A._ forme un recours contre l'arrêt cantonal. Il déclare maintenir sa demande de récusation. Il a requis, par la suite, l'assistance judiciaire.
La Chambre pénale a renoncé à présenter des observations. Le Ministère public conclut au rejet du recours dans la mesure où il serait recevable, en précisant que l'appel a été déclaré irrecevable par arrêt de la Cour d'appel pénal du 1er décembre 2009.
Considérant en droit:
1. Conformément aux art. 78 et 92 al. 1 LTF, une décision relative à la récusation d'un magistrat dans la procédure pénale peut faire immédiatement l'objet d'un recours en matière pénale.
1.1 Le recourant, en tant que partie à la procédure pénale et auteur de la demande de récusation, a qualité pour agir (art. 81 al. 1 LTF). Même si son appel a déjà été déclaré irrecevable, il dispose toujours d'un intérêt pour recourir car l'admission de sa demande de récusation pourrait avoir une influence sur la procédure au fond. Le recourant a agi dans le délai de trente jours prescrit à l'art. 100 al. 1 LTF.
1.2 La décision attaquée est rendue en dernière instance cantonale, puisque le droit fribourgeois ne prévoit apparemment pas encore d'instance de recours au sens de l'art. 80 al. 2 LTF; cela est admissible, tant que le délai prévu à l'art. 130 al. 1 LTF n'est pas échu.
1.3 Même si le recourant ne fait que confirmer sa demande de récusation, une telle conclusion peut se comprendre comme tendant à l'annulation, voire à la réforme de l'arrêt attaqué dans le sens de l'admission de sa requête initiale. Une telle conclusion peut être considérée comme recevable.
2. Le recourant estime qu'un procureur serait récusable à l'instar de toutes les personnes qui participent au procès pénal. Par ailleurs la réponse du Substitut à la demande de récusation faisait ressortir que celui-ci connaissait le recourant. Son animosité ne ferait plus de doute, après la plainte qu'il a déposée contre le recourant pour atteinte à l'honneur. Le recourant estime que la Chambre pénale ne pouvait lui reprocher son attitude lors de la procédure pénale, notamment son refus de répondre au juge d'instruction, puisqu'aucune conséquence ne peut découler, pour le prévenu, de l'exercice de son droit de se taire.
2. Le recourant estime qu'un procureur serait récusable à l'instar de toutes les personnes qui participent au procès pénal. Par ailleurs la réponse du Substitut à la demande de récusation faisait ressortir que celui-ci connaissait le recourant. Son animosité ne ferait plus de doute, après la plainte qu'il a déposée contre le recourant pour atteinte à l'honneur. Le recourant estime que la Chambre pénale ne pouvait lui reprocher son attitude lors de la procédure pénale, notamment son refus de répondre au juge d'instruction, puisqu'aucune conséquence ne peut découler, pour le prévenu, de l'exercice de son droit de se taire.
2.1 En vertu des art. 6 par. 1 CEDH et 30 al. 1 Cst., tout plaideur peut exiger la récusation d'un magistrat dont la situation ou le comportement est de nature à faire naître un doute sur son impartialité. Il suffit que les circonstances donnent l'apparence de la prévention et fassent redouter une activité partiale du magistrat, mais seules des circonstances constatées objectivement doivent être prises en considération; les impressions purement individuelles du plaideur ne sont pas décisives (ATF 134 I 20 consid. 4.1 p. 21; 131 I 24 consid. 1.1 p. 25 et les arrêts cités). Saisi du grief de la violation du droit à un juge indépendant et impartial, le Tribunal fédéral n'examine l'application du droit cantonal que sous l'angle de l'arbitraire (art. 9 Cst.; pour la définition de l'arbitraire, cf. ATF 134 I 23 consid. 8 p. 42 et les arrêts cités). Il apprécie en revanche librement la compatibilité de la procédure suivie en l'espèce avec les garanties constitutionnelles offertes en cette matière (ATF 126 I 68 consid. 3b p. 73 et la jurisprudence cités).
L'art. 54 de la loi fribourgeoise d'organisation judiciaire (OJ/FR) prévoit la récusation facultative d'un magistrat ou d'un collaborateur de l'ordre judiciaire, s'il se trouve avec une partie dans un rapport d'amitié étroite ou d'inimitié personnelle, d'obligation ou de dépendance particulière (let. a), ou si d'autres motifs sérieux rendent douteuse son impartialité (let. c).
2.2 S'agissant d'un représentant du Ministère public, les exigences d'impartialité ne sont en principe pas les mêmes que pour les autorités judiciaires proprement dites. En effet, ni les art. 29 et 30 Cst., ni l'art. 6 par. 1 CEDH ne confèrent à l'accusé une protection particulière à l'égard d'un magistrat dont le rôle essentiel est de soutenir l'accusation au cours de l'instruction et devant les juridictions pénales, en tant que partie à la procédure (ATF 124 I 76 consid. 2 p. 77 ss; 118 Ia 95 consid. 3b p. 98; 112 Ia 142 consid. 2a p. 143 s. et les arrêts cités). Il en va différemment lorsque le procureur sort de son rôle d'accusateur public pour assumer des fonctions d'ordre juridictionnel, par exemple lorsqu'il rend une ordonnance pénale qui devient exécutoire faute d'opposition (ATF 124 I 76 consid. 2; 112 Ia 142 consid. 2b p. 144 ss).
Dès lors, si le recourant relève avec raison que tous les magistrats intervenant au procès pénal sont en principe récusables, il méconnaît qu'une récusation ne saurait être admise aux mêmes conditions pour un procureur que pour un juge du fond.
2.3 En l'occurrence, le Substitut du Procureur n'a assumé aucune fonction juridictionnelle. Il n'est pas intervenu durant l'instruction, ni en première instance et s'est borné à répondre au recours cantonal en concluant à son irrecevabilité, sans même se prononcer sur la culpabilité du recourant. Dans ces circonstances, la cour cantonale pouvait retenir, sans arbitraire et conformément aux principes rappelés ci-dessus, qu'il n'y avait en principe pas lieu à récusation.
2.4 Dans des considérations subsidiaires - et qui, à ce titre, ne sont nullement en contradiction avec ce qui précède -, la cour cantonale a aussi estimé que les déclarations du recourant n'étaient pas crédibles et que ses allégations de partialité étaient purement subjectives. Ces considérations ne sont, elles non plus, pas arbitraires. Le recourant se bornait à affirmer que le substitut lui avait donné des cours d'appui de droit, plus de dix ans auparavant, ce qui ne constitue pas un motif de récusation. Le recourant laissait aussi entendre qu'il aurait été à l'origine du licenciement de l'intéressé, mais l'existence même d'un tel licenciement, contesté par le Substitut, n'est pas démontrée. Aucune des allégations du recourant n'est étayée par le moindre indice objectif. Le Substitut explique pour sa part qu'il n'avait aucun souvenir du recourant avant le dépôt de la demande de récusation, ce qui paraît crédible, compte tenu du temps écoulé.
2.5 Le recourant estime enfin que le dépôt d'une plainte pénale ne laisserait plus de doute quant à l'animosité du magistrat à son égard. Il s'agit d'un fait nouveau, intervenu le 9 novembre 2009, soit après le prononcé de l'arrêt cantonal, qui ne peut être pris en considération en vertu de l'art. 99 al. 1 LTF. Même recevable, un tel fait ne changerait rien à l'issue de la cause. En effet, le dépôt de la plainte pénale - uniquement motivé par les allégations contenues dans la demande de récusation - est postérieur aux observations faites par le Substitut au recours cantonal. Or, il s'agit de l'unique intervention de ce magistrat dans la procédure pénale.
3. Sur le vu de ce qui précède, le recours est rejeté dans la mesure où il est recevable. L'assistance judiciaire ne peut être accordée au recourant, dont les conclusions paraissaient d'emblée vouées à l'échec. Conformément à l'art. 66 al. 1 LTF, les frais judiciaires sont mis à la charge du recourant.
Par ces motifs, le Tribunal fédéral prononce:
1. Le recours est rejeté dans la mesure où il est recevable.
2. La demande d'assistance judiciaire est rejetée.
3. Les frais judiciaires, arrêtés à 1000 fr., sont mis à la charge du recourant.
4. Le présent arrêt est communiqué aux parties et au Tribunal cantonal du canton de Fribourg, Chambre pénale.
Lausanne, le 26 janvier 2010
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le Président: Le Greffier:
Féraud Kurz